#include "mdxserver.h"
#include <QDebug>
#include "base.h"

#define MODNAME "MDxserver"

MDxserver::MDxserver(QObject *parent) :
    QObject(parent)
{
    this->server = new xmlrpc::Server(this);
    //this->server->registerMethod("logon",QVariant::String,QVariant::String,QVariant::String);
    // авторизация пользователя:
    // принимаем логин и пароль
    // отдаем уникальный хэшь строку
    // который и будет выступать в роли идентификатора
    this->server->registerMethod("logon", QVariant::List,
                                 QVariant::List );
    // запрос списка пользователей
    this->server->registerMethod("getuserslist",QVariant::List,
                                 QVariant::List);
    // добавление нового пользователя
    this->server->registerMethod("adduser",QVariant::List,
                                 QVariant::List);
    // редактирование пользователя
    this->server->registerMethod("edituser",QVariant::List,
                                 QVariant::List);
    this->server->registerMethod("adm.events.getlist",QVariant::List,
                                 QVariant::List);

    // удаление пользователя
    this->server->registerMethod("deluser",QVariant::List,
                                 QVariant::List);
    // добавление события
    this->server->registerMethod("adm.events.add",QVariant::List,
                                 QVariant::List);
    // редактирование события
    this->server->registerMethod("adm.events.edit",QVariant::List,
                                 QVariant::List);
    // удаление события
    this->server->registerMethod("adm.events.del",QVariant::List,
                                 QVariant::List);




    this->server->registerMethod("adm.tariffs.getlist",QVariant::List,
                                 QVariant::List);
    this->server->registerMethod("adm.tariffs.getlist_for_events",QVariant::List,
                                 QVariant::List);
    this->server->registerMethod("adm.tariffs.getlist_aa",QVariant::List,
                                 QVariant::List);
    this->server->registerMethod("adm.tariffs.getlist_ab",QVariant::List,
                    QVariant::List);
    this->server->registerMethod("adm.tariffs.add",QVariant::List,
                                 QVariant::List);
    this->server->registerMethod("adm.tariffs.edit",QVariant::List,
                                 QVariant::List);
    this->server->registerMethod("adm.tariffs.del",QVariant::List,
                                 QVariant::List);



    // пользовательские функции
    this->server->registerMethod("user.events.getlist",QVariant::List,
                                 QVariant::List);
    this->server->registerMethod("user.tariffs.getlist",QVariant::List,
                                 QVariant::List);

    this->server->registerMethod("user.ticket.sale",QVariant::List,
                                 QVariant::List);

    // запрашиваем информацию по билету.
    this->server->registerMethod("user.reticket.info",QVariant::List,
                                 QVariant::List);
    // помечаем билет как возвращенный
    this->server->registerMethod("user.reticket.back",QVariant::List,
                                 QVariant::List);

    // отчет пользователю о проданных им билетах
    this->server->registerMethod("user.rpt.ticketslist",QVariant::List,
                                 QVariant::List);


    // работаем с плагинами отчетов
    // плагин отчет событие
    this->server->registerMethod("rept_event.geteventslist",QVariant::List,
                                 QVariant::List);
    this->server->registerMethod("rept_event.getevtick",QVariant::List,
                                 QVariant::List);


    // плагин отчет пользователь
    this->server->registerMethod("rept_user.getusers",QVariant::List,
                                 QVariant::List);
    this->server->registerMethod("rept_user.gettickets",QVariant::List,
                                 QVariant::List);

    connect(this->server,SIGNAL(incomingRequest(int,QString,QList<xmlrpc::Variant>)),
            this,SLOT(slotProcessRequest(int,QString,QList<xmlrpc::Variant>)));

    // set defaults
    this->port=9988;
    this->session_ttl=3600;
    this->protoV = VER;
}

void MDxserver::setPort(int port){
    this->port = port;
}

QString MDxserver::sqlsafe(const QString & str){
    QString aa = str;
    aa.replace("\\","\\\\");
    aa.replace("\"","\\\"");
    aa.replace("'","\\'");
    return aa;
}

void MDxserver::setBase(const QString &addr, const QString &user, const QString &pass, const QString &dbname, int port){
    this->db = QSqlDatabase::addDatabase("QMYSQL");
    db.setHostName(addr);
    db.setPort(port);
    db.setDatabaseName(dbname);
    db.setUserName(user);
    db.setPassword(pass);

}

void MDxserver::start(int pingMins){
    if(!db.open()){
        emit this->sigLog(MODNAME,MLog::logAlert,"Failure connect to database, error text is:\n"+db.lastError().text());
        exit(1);
    }else{
        emit this->sigLog(MODNAME,MLog::logInfo,QString("connect to database success"));
    if(this->server->listen(this->port)){
        emit this->sigLog(MODNAME,MLog::logInfo,QString("xml-rpc server started on port %1").arg(this->port));
        emit this->sigLog(MODNAME,MLog::logInfo,QString("version - %1 build # - %2").arg(this->protoV).arg(GIT_HASH));
        // запускаем систему пингования базы при долгих простоях.
        this->dbtimer = new QTimer();
        this->isDbtimerTest=false;
        connect(this->dbtimer,SIGNAL(timeout()),this,SLOT(slotTimerTik()));
        this->dbtimer->start(pingMins*60000);

    }else{
        emit this->sigLog(MODNAME,MLog::logInfo,QString("failure start xml-rpc on port %1").arg(this->port));
        exit(2);
    }
    }
}

void MDxserver::slotTimerTik(){
    // сработал таймер, отправляем базе шутошный пинг запрос
    this->isDbtimerTest=true;
    QString qline="select 1";
    QSqlQuery query;
    emit this->sigLog(MODNAME,MLog::logDebug,QString("SQL [%1]").arg(qline));
    if(!query.exec(qline)){
        emit this->sigLog(MODNAME,MLog::logAlert,QString("error ")+ERR_SQLERR);
    }else{
        emit this->sigLog(MODNAME,MLog::logInfo,QString("success ping db"));
    }
    this->isDbtimerTest=false;
}


void MDxserver::slotProcessRequest(int id, QString methodName, QList<xmlrpc::Variant> parameters){
    // проверяем открыта ли база данных, если нет то ругаемся и завершаем работу.
    if(!this->db.isOpen()){
        emit this->sigLog(MODNAME,MLog::logAlert,QString("error ")+ERR_SQLDB);
        this->server->sendFault(id,ERR_SQLDB_ID,ERR_SQLDB);
    }else{
    //проверяем совершается ли пинг, если да то надо подождать
    if(this->isDbtimerTest){
        while(!this->isDbtimerTest){
            Sleeper::msleep(100);
            QCoreApplication::processEvents(QEventLoop::AllEvents, 100);
        }
    }else{
    QString host = this->server->getIP(id);

    // перечень методов
    // logon - метод авторизации пользователя
    if(methodName == "logon"){
        emit this->sigLog(MODNAME,MLog::logInfo,QString("RPC logon HOST=%1").arg(host));
        // проверяем количество параметров
        if(parameters.at(0).toList().size()!=3){
            // неверное количество параметров
            emit this->sigLog(MODNAME,MLog::logAlert,QString("error ")+ERR_PARAMSCOUNT);
            this->server->sendFault(id,ERR_PARAMSCOUNT_ID,ERR_PARAMSCOUNT);
        }else{
            // проверяем версию протокола клиента.
            if(this->protoV != parameters.at(0).toList().at(2).toString() ){
                emit this->sigLog(MODNAME,MLog::logAlert,QString("error ")+ERR_PROTOFAIL);
                this->server->sendFault(id,ERR_PROTOFAIL_ID,ERR_PROTOFAIL);
            }else{
            // все гуд, стучимся в базу и проверяем есть ли такой юзер с паролем среди активных
            QString qline=QString("select count(*) from `users` where `username`='%1' and `password`=md5('%2') and `state`='1'")
                    .arg(this->sqlsafe(parameters.at(0).toList().at(0).toString()))
                    .arg(this->sqlsafe(parameters.at(0).toList().at(1).toString()));
            QSqlQuery query;
            emit this->sigLog(MODNAME,MLog::logDebug,QString("SQL [%1]").arg(qline));
            if(!query.exec(qline)){
                emit this->sigLog(MODNAME,MLog::logAlert,QString("error ")+ERR_SQLERR);
                this->server->sendFault(id,ERR_SQLERR_ID,ERR_SQLERR);
            }else{
            query.next();
            int isuser = query.value(0).toInt();
            if(isuser!=1){
                // юзверь не существует или задублирован. фейл кароче гг
                emit this->sigLog(MODNAME,MLog::logAlert,QString("error ")+ERR_LOGON);
                this->server->sendFault(id,ERR_LOGON_ID,ERR_LOGON);
            }else{
                // все отлично
                // генерируем уникальный хэш
                QString unicHash = QString::number(QDate::currentDate().toJulianDay())+"_"
                        +QString(QTime::currentTime().toString())+"_"
                        +QString::number(QTime::currentTime().msec());
                emit this->sigLog(MODNAME,MLog::logDebug,QString("logon user %1 is ok. hash is %2")
                                  .arg(this->sqlsafe(parameters.at(0).toList().at(0).toString()))
                                  .arg(unicHash));
                emit this->sigLog(MODNAME,MLog::logDebug,QString("Update sessions"));
                // а теперь создаем сессию для этого пользователя и уникального хэша.
                QString qline = QString
                        ("insert into `sessions` (`id_users`,`lastsync`,`userhash`) values((select `id` from `users` where `username`='%1'),NOW(),'%2')")
                        .arg(this->sqlsafe(parameters.at(0).toList().at(0).toString()))
                        .arg(this->sqlsafe(unicHash));
                QSqlQuery query;
                emit this->sigLog(MODNAME,MLog::logDebug,QString("SQL [%1]").arg(qline));
                if(!query.exec(qline)){
                    emit this->sigLog(MODNAME,MLog::logAlert,QString("error ")+ERR_SQLERR);
                    this->server->sendFault(id,ERR_SQLERR_ID,ERR_SQLERR);
                }else{
                // хешь создался. отдаем его клиенту.
                    QList<xmlrpc::Variant> ret;
                    ret.append(unicHash);
                // получаем тип пользователя
                    QString qx = QString("select `usertype` from `users` where `username`='%1' and `state`='1'")
                            .arg(this->sqlsafe(parameters.at(0).toList().at(0).toString()));
                    emit this->sigLog(MODNAME,MLog::logDebug,QString("SQL [%1]").arg(qx));
                    QSqlQuery qq;
                    if(!qq.exec(qx)){
                        emit this->sigLog(MODNAME,MLog::logAlert,QString("error ")+ERR_SQLERR);
                        this->server->sendFault(id,ERR_SQLERR_ID,ERR_SQLERR);
                    }
                    // добавляем то что вернулось. это тип
                    qq.next();
                    ret.append(qq.value(0).toInt());
                    this->server->sendReturnValue(id,ret);
                    emit this->sigLog(MODNAME,MLog::logInfo,QString("RPC logon USER=%2 SID=%3 HOST=%1").arg(host)
                                      .arg(this->sqlsafe(parameters.at(0).toList().at(0).toString()))
                                      .arg(unicHash));
                }
            }
            }
            }
        }
    }
    // getuserslist - метод получения списка пользователей
    if(methodName == "getuserslist"){
        emit this->sigLog(MODNAME,MLog::logInfo,QString("RPC start  getuserslist USER=%2 SID=%3 HOST=%1").arg(host)
                          .arg(parameters.at(0).toList().at(0).toString())
                          .arg(parameters.at(0).toList().at(1).toString()));
        // опапа прилетел запрос
        // сначала зачищаем сессии
        if(!this->clearOldSessions()){
                emit this->sigLog(MODNAME,MLog::logAlert,QString("error ")+ERR_SESSCLRERR);
                this->server->sendFault(id,ERR_SESSCLRERR_ID,ERR_SESSCLRERR);
        }else{

        // проверяем количество параметров - должно быть 2 имя пользователя и его хэш
        if(parameters.at(0).toList().size()!=2){
            // неверное количество параметров
            emit this->sigLog(MODNAME,MLog::logAlert,QString("error ")+ERR_PARAMSCOUNT);
            this->server->sendFault(id,ERR_PARAMSCOUNT_ID,ERR_PARAMSCOUNT);
        }else{
            // теперь проверяем наличие сессии данного пользователя в списке активных,
            // ежели нема ее там то кишь его кишь из работы, пущай перелогиниться.

            // вынимаем пользователя и хэш
            if(!this->testSesstion(parameters.at(0).toList().at(0).toString(),
                               parameters.at(0).toList().at(1).toString())){
                emit this->sigLog(MODNAME,MLog::logAlert,QString("error ")+ERR_SESSTESTERR);
                this->server->sendFault(id,ERR_SESSTESTERR_ID,ERR_SESSTESTERR);
            }else{
                // сессию обновили успешно, идем дальше.
                // необходимо получить список пользователей и отдать его клиенту
                // а отдать надо имя, тип и цвет
                QString qstr="select `usertype`,`color`,`username` from `users` where `state`='1' order by `username`";
                QSqlQuery q1;
                emit this->sigLog(MODNAME,MLog::logDebug,QString("SQL [%1]").arg(qstr));
                if(!q1.exec(qstr)){
                    emit this->sigLog(MODNAME,MLog::logAlert,QString("error ")+ERR_SQLERR);
                    this->server->sendFault(id,ERR_SQLERR_ID,ERR_SQLERR);
                }else{
                    // формируем ответ
                    QList<xmlrpc::Variant> ret;
                    while(q1.next()){
                        ret.append(q1.value(0).toInt());
                        ret.append(q1.value(1).toString());
                        ret.append(q1.value(2).toString());
                    }
                    // отправляем ответ
                    this->server->sendReturnValue(id,ret);
                    emit this->sigLog(MODNAME,MLog::logInfo,QString("RPC stop getuserslist USER=%2 SID=%3 HOST=%1").arg(host)
                                      .arg(parameters.at(0).toList().at(0).toString())
                                      .arg(parameters.at(0).toList().at(1).toString()));
                }
            }
        }
        }
    }

    // adduser - метод добавления пользователя
    if(methodName == "adduser"){
        emit this->sigLog(MODNAME,MLog::logInfo,QString("RPC start  adduser USER=%2 SID=%3 HOST=%1").arg(host)
                          .arg(parameters.at(0).toList().at(0).toString())
                          .arg(parameters.at(0).toList().at(1).toString()));
        // опапа прилетел запрос
        // сначала зачищаем сессии
        if(!this->clearOldSessions()){
                emit this->sigLog(MODNAME,MLog::logAlert,QString("error ")+ERR_SESSCLRERR);
                this->server->sendFault(id,ERR_SESSCLRERR_ID,ERR_SESSCLRERR);
        }else{

        // проверяем количество параметров - должно быть 6 имя пользователя и его хэш
        // имя нового пользователя его новый пароль цвет и тип
        if(parameters.at(0).toList().size()!=6){
            // неверное количество параметров
            emit this->sigLog(MODNAME,MLog::logAlert,QString("error ")+ERR_PARAMSCOUNT);
            this->server->sendFault(id,ERR_PARAMSCOUNT_ID,ERR_PARAMSCOUNT);
        }else{
            // теперь проверяем наличие сессии данного пользователя в списке активных,
            // ежели нема ее там то кишь его кишь из работы, пущай перелогиниться.

            // вынимаем пользователя и хэш
            if(!this->testSesstion(parameters.at(0).toList().at(0).toString(),
                               parameters.at(0).toList().at(1).toString())){
                emit this->sigLog(MODNAME,MLog::logAlert,QString("error ")+ERR_SESSTESTERR);
                this->server->sendFault(id,ERR_SESSTESTERR_ID,ERR_SESSTESTERR);
            }else{
                // собственно делаем что надо
                QString uname=parameters.at(0).toList().at(2).toString();
                QString upass=parameters.at(0).toList().at(3).toString();
                QString ucolor=parameters.at(0).toList().at(4).toString();
                int utype=parameters.at(0).toList().at(5).toInt();

                // проверяем наличие такого пользователя
                // select count(*) from `users` where `username`='USER' and `state`='1'
                QString qs1=QString("select count(*) from `users` where `username`='%1' and `state`='1'").arg(this->sqlsafe(uname));
                QSqlQuery qq1;
                emit this->sigLog(MODNAME,MLog::logDebug,QString("SQL [%1]").arg(qs1));
                if(!qq1.exec(qs1)){
                    emit this->sigLog(MODNAME,MLog::logAlert,QString("error ")+ERR_SQLERR);
                    this->server->sendFault(id,ERR_SQLERR_ID,ERR_SQLERR);
                }else{
                // смотрим ответ
                    qq1.next();
                    int isOK = qq1.value(0).toInt();
                    if(isOK!=0){
                        // юзер уже существует, бида пичаль, ругаем клиента
                        emit this->sigLog(MODNAME,MLog::logAlert,QString("error ")+ERR_USEREXIST);
                        this->server->sendFault(id,ERR_USEREXIST_ID,ERR_USEREXIST);
                    }else{
                // если пользователя нет, то добавляем
                // insert into `users` (`username`,`password`,`color`,`usertype`,`state`) values('USER','PASS','COLOR','USERTYPE','1')
                        QString qs2=QString("insert into `users` (`username`,`password`,`color`,`usertype`,`state`) values('%1',md5('%2'),'%3',%4,'1')")
                                .arg(this->sqlsafe(uname))
                                .arg(this->sqlsafe(upass))
                                .arg(this->sqlsafe(ucolor))
                                .arg(utype);
                        QSqlQuery qq2;
                        emit this->sigLog(MODNAME,MLog::logDebug,QString("SQL [%1]").arg(qs2));
                        if(!qq2.exec(qs2)){
                            emit this->sigLog(MODNAME,MLog::logAlert,QString("error ")+ERR_SQLERR);
                            this->server->sendFault(id,ERR_SQLERR_ID,ERR_SQLERR);
                        }else{
                            // отдаем клиенту ответ OK
                            // формируем ответ
                            QList<xmlrpc::Variant> ret;
                            ret.append(QString("OK"));
                            // отправляем ответ
                            this->server->sendReturnValue(id,ret);
                            emit this->sigLog(MODNAME,MLog::logInfo,QString("RPC stop adduser USER=%2 SID=%3 HOST=%1").arg(host)
                                  .arg(parameters.at(0).toList().at(0).toString())
                                  .arg(parameters.at(0).toList().at(1).toString()));
                        }
                    }
                }
            }
        }}
    }

    // edituser - метод модификации пользователя
    if(methodName == "edituser"){
        emit this->sigLog(MODNAME,MLog::logInfo,QString("RPC start  edituser USER=%2 SID=%3 HOST=%1").arg(host)
                          .arg(parameters.at(0).toList().at(0).toString())
                          .arg(parameters.at(0).toList().at(1).toString()));
        // опапа прилетел запрос
        // сначала зачищаем сессии
        if(!this->clearOldSessions()){
                emit this->sigLog(MODNAME,MLog::logAlert,QString("error ")+ERR_SESSCLRERR);
                this->server->sendFault(id,ERR_SESSCLRERR_ID,ERR_SESSCLRERR);
        }else{

        // проверяем количество параметров - должно быть 7 имя пользователя и его хэш
        // старое имя пользователя, новое, пароль цвет и тип
        if(parameters.at(0).toList().size()!=7){
            // неверное количество параметров
            emit this->sigLog(MODNAME,MLog::logAlert,QString("error ")+ERR_PARAMSCOUNT);
            this->server->sendFault(id,ERR_PARAMSCOUNT_ID,ERR_PARAMSCOUNT);
        }else{
            // теперь проверяем наличие сессии данного пользователя в списке активных,
            // ежели нема ее там то кишь его кишь из работы, пущай перелогиниться.

            // вынимаем пользователя и хэш
            if(!this->testSesstion(parameters.at(0).toList().at(0).toString(),
                               parameters.at(0).toList().at(1).toString())){
                emit this->sigLog(MODNAME,MLog::logAlert,QString("error ")+ERR_SESSTESTERR);
                this->server->sendFault(id,ERR_SESSTESTERR_ID,ERR_SESSTESTERR);
            }else{
                // собственно делаем что надо

                // вынимаем данные
                QString olduname=parameters.at(0).toList().at(2).toString();
                QString uname=parameters.at(0).toList().at(3).toString();
                QString upass=parameters.at(0).toList().at(4).toString();
                QString ucolor=parameters.at(0).toList().at(5).toString();
                QString utype=parameters.at(0).toList().at(6).toString();
                // формируем запрос
                QString qs1=QString("update `users` set `username`='%1',")
                        .arg(this->sqlsafe(uname));
                if(upass.size() != 0 ){
                    qs1+=QString("`password`=md5('%1') ,")
                            .arg(this->sqlsafe(upass));
                }
                qs1+=QString(" `color`='%1' , `usertype`='%2' , `state`='1' where `username`='%3'")
                        .arg(ucolor)
                        .arg(utype)
                        .arg(this->sqlsafe(olduname));

                // стучимся в базу
                QSqlQuery qq1;
                emit this->sigLog(MODNAME,MLog::logDebug,QString("SQL [%1]").arg(qs1));
                if(!qq1.exec(qs1)){
                    emit this->sigLog(MODNAME,MLog::logAlert,QString("error ")+ERR_SQLERR);
                    this->server->sendFault(id,ERR_SQLERR_ID,ERR_SQLERR);
                }else{
                    // отдаем клиенту ответ OK
                    // формируем ответ
                    QList<xmlrpc::Variant> ret;
                    ret.append(QString("OK"));
                    // отправляем ответ
                    this->server->sendReturnValue(id,ret);

                emit this->sigLog(MODNAME,MLog::logInfo,QString("RPC stop edituser USER=%2 SID=%3 HOST=%1").arg(host)
                                  .arg(parameters.at(0).toList().at(0).toString())
                                  .arg(parameters.at(0).toList().at(1).toString()));
                }
            }
        }}
    }

    // deluser - метод удаления пользователя
    if(methodName == "deluser"){
        emit this->sigLog(MODNAME,MLog::logInfo,QString("RPC start  deluser USER=%2 SID=%3 HOST=%1").arg(host)
                          .arg(parameters.at(0).toList().at(0).toString())
                          .arg(parameters.at(0).toList().at(1).toString()));
        // опапа прилетел запрос
        // сначала зачищаем сессии
        if(!this->clearOldSessions()){
                emit this->sigLog(MODNAME,MLog::logAlert,QString("error ")+ERR_SESSCLRERR);
                this->server->sendFault(id,ERR_SESSCLRERR_ID,ERR_SESSCLRERR);
        }else{

        // проверяем количество параметров - должно быть 3 имя пользователя и его хэш
        // имя удаляемого пользователя
        if(parameters.at(0).toList().size()!=3){
            // неверное количество параметров
            emit this->sigLog(MODNAME,MLog::logAlert,QString("error ")+ERR_PARAMSCOUNT);
            this->server->sendFault(id,ERR_PARAMSCOUNT_ID,ERR_PARAMSCOUNT);
        }else{
            // теперь проверяем наличие сессии данного пользователя в списке активных,
            // ежели нема ее там то кишь его кишь из работы, пущай перелогиниться.

            // вынимаем пользователя и хэш
            if(!this->testSesstion(parameters.at(0).toList().at(0).toString(),
                               parameters.at(0).toList().at(1).toString())){
                emit this->sigLog(MODNAME,MLog::logAlert,QString("error ")+ERR_SESSTESTERR);
                this->server->sendFault(id,ERR_SESSTESTERR_ID,ERR_SESSTESTERR);
            }else{
                // собственно делаем что надо
                // вынимаем имя удаляемого пользователя
                QString uname = parameters.at(0).toList().at(2).toString();
                QString qs1=QString("update `users` set `state`='0' where `username`='%1'")
                        .arg(this->sqlsafe(uname));
                emit this->sigLog(MODNAME,MLog::logDebug,QString("SQL [%1]").arg(qs1));
                QSqlQuery qq1;
                if(!qq1.exec(qs1)){
                    emit this->sigLog(MODNAME,MLog::logAlert,QString("error ")+ERR_SQLERR);
                    this->server->sendFault(id,ERR_SQLERR_ID,ERR_SQLERR);
                }else{
                    // отдаем клиенту ответ OK
                    // формируем ответ
                    QList<xmlrpc::Variant> ret;
                    ret.append(QString("OK"));
                    // отправляем ответ
                    this->server->sendReturnValue(id,ret);

                emit this->sigLog(MODNAME,MLog::logInfo,QString("RPC stop deluser USER=%2 SID=%3 HOST=%1").arg(host)
                                  .arg(parameters.at(0).toList().at(0).toString())
                                  .arg(parameters.at(0).toList().at(1).toString()));
                }
            }
        }}
    }

    // adm.events.getlist - получение списка событий для редактирования администратора
    if(methodName == "adm.events.getlist"){
        emit this->sigLog(MODNAME,MLog::logInfo,QString("RPC start  adm.events.getlist USER=%2 SID=%3 HOST=%1").arg(host)
                          .arg(parameters.at(0).toList().at(0).toString())
                          .arg(parameters.at(0).toList().at(1).toString()));
        // опапа прилетел запрос
        // сначала зачищаем сессии
        if(!this->clearOldSessions()){
                emit this->sigLog(MODNAME,MLog::logAlert,QString("error ")+ERR_SESSCLRERR);
                this->server->sendFault(id,ERR_SESSCLRERR_ID,ERR_SESSCLRERR);
        }else{

        // проверяем количество параметров - должно быть 4 имя пользователя и его хэш
        // дата начала и дата конца
        if(parameters.at(0).toList().size()!=4){
            // неверное количество параметров
            emit this->sigLog(MODNAME,MLog::logAlert,QString("error ")+ERR_PARAMSCOUNT);
            this->server->sendFault(id,ERR_PARAMSCOUNT_ID,ERR_PARAMSCOUNT);
        }else{
            // теперь проверяем наличие сессии данного пользователя в списке активных,
            // ежели нема ее там то кишь его кишь из работы, пущай перелогиниться.

            // вынимаем пользователя и хэш
            if(!this->testSesstion(parameters.at(0).toList().at(0).toString(),
                               parameters.at(0).toList().at(1).toString())){
                emit this->sigLog(MODNAME,MLog::logAlert,QString("error ")+ERR_SESSTESTERR);
                this->server->sendFault(id,ERR_SESSTESTERR_ID,ERR_SESSTESTERR);
            }else{
                // собственно делаем что надо
                // вынимаем дату начала и конца
                QString d_de=parameters.at(0).toList().at(2).toString();
                QString d_gxis=parameters.at(0).toList().at(3).toString();
                // наша задача получить список и отправить его клиенту
                QString qs1=QString("select `event_dt`,`state`,`capacity`,`name`,`text` from `events` ")+
                        QString("where `event_dt` > '%1' and `event_dt` < '%2' order by `event_dt`")
                        .arg(this->sqlsafe(d_de))
                        .arg(this->sqlsafe(d_gxis));

                QSqlQuery qq1;
                emit this->sigLog(MODNAME,MLog::logDebug,QString("SQL [%1]").arg(qs1));
                if(!qq1.exec(qs1)){
                    emit this->sigLog(MODNAME,MLog::logAlert,QString("error ")+ERR_SQLERR);
                    this->server->sendFault(id,ERR_SQLERR_ID,ERR_SQLERR);
                }else{
                    // формируем ответ
                    QList<xmlrpc::Variant> ret;
                    while(qq1.next()){
                        QString ename1 = qq1.value(3).toString();
                        QString edate1 = qq1.value(0).toDateTime().toString("yyyy-MM-dd hh:mm:ss");
                        ret.append(edate1);
                        ret.append(qq1.value(1).toInt());
                        ret.append(qq1.value(2).toString());
                        ret.append(ename1);
                        ret.append(qq1.value(4).toString());
                        // в цикле запрашиваем свободно для каждого события

                        QString qs2 =QString("select `events`.`capacity` -  \
                                             (select count(*) from `tickets` where `status` = 0 and  `tickets`.`event_id` =  (select `events`.`id` from `events` where `name` = '%1' and `event_dt` = '%2'))\
                                from `events` where `name` = '%1' and `event_dt` = '%2'")
                                .arg(this->sqlsafe(ename1))
                                .arg(this->sqlsafe(edate1));
                        QSqlQuery qq2;
                        emit this->sigLog(MODNAME,MLog::logDebug,QString("SQL [%1]").arg(qs2));
                        if(!qq2.exec(qs2)){
                            emit this->sigLog(MODNAME,MLog::logAlert,QString("error ")+ERR_SQLERR);
                            this->server->sendFault(id,ERR_SQLERR_ID,ERR_SQLERR);
                        }else{
                            // получили свободных
                            qq2.next();
                            ret.append(qq2.value(0).toInt());

                        }

                    }
                    // отправляем ответ
                    this->server->sendReturnValue(id,ret);
                emit this->sigLog(MODNAME,MLog::logInfo,QString("RPC stop adm.events.getlist USER=%2 SID=%3 HOST=%1").arg(host)
                                  .arg(parameters.at(0).toList().at(0).toString())
                                  .arg(parameters.at(0).toList().at(1).toString()));
                }
            }
        }}
    }

    //adm.events.add - добавление нового события - администратор
    if(methodName == "adm.events.add"){
        emit this->sigLog(MODNAME,MLog::logInfo,QString("RPC start  adm.events.add USER=%2 SID=%3 HOST=%1").arg(host)
                          .arg(parameters.at(0).toList().at(0).toString())
                          .arg(parameters.at(0).toList().at(1).toString()));
        // опапа прилетел запрос
        // сначала зачищаем сессии
        if(!this->clearOldSessions()){
                emit this->sigLog(MODNAME,MLog::logAlert,QString("error ")+ERR_SESSCLRERR);
                this->server->sendFault(id,ERR_SESSCLRERR_ID,ERR_SESSCLRERR);
        }else{

        // проверяем количество параметров - должно быть 8  имя пользователя и его хэш
        // имя события, описание, дата, объем и статус + список включеных тарифов
        if(parameters.at(0).toList().size()!=8){
            // неверное количество параметров
            emit this->sigLog(MODNAME,MLog::logAlert,QString("error ")+ERR_PARAMSCOUNT);
            this->server->sendFault(id,ERR_PARAMSCOUNT_ID,ERR_PARAMSCOUNT);
        }else{
            // теперь проверяем наличие сессии данного пользователя в списке активных,
            // ежели нема ее там то кишь его кишь из работы, пущай перелогиниться.

            // вынимаем пользователя и хэш
            if(!this->testSesstion(parameters.at(0).toList().at(0).toString(),
                               parameters.at(0).toList().at(1).toString())){
                emit this->sigLog(MODNAME,MLog::logAlert,QString("error ")+ERR_SESSTESTERR);
                this->server->sendFault(id,ERR_SESSTESTERR_ID,ERR_SESSTESTERR);
            }else{
                // собственно делаем что надо
                // вынимаем данные
                QString ename=parameters.at(0).toList().at(2).toString();
                QString edesc=parameters.at(0).toList().at(3).toString();
                QString edate=parameters.at(0).toList().at(4).toString();
                int ecap=parameters.at(0).toList().at(5).toInt();
                int estatus=parameters.at(0).toList().at(6).toInt();

                // проверяем наличие события с таким же именем в такую же дату.
                QString qs1=QString("select count(*) from `events` where `name`='%1' and `event_dt`='%2'")
                        .arg(this->sqlsafe(ename)).arg(this->sqlsafe(edate));
                QSqlQuery qq1;
                emit this->sigLog(MODNAME,MLog::logDebug,QString("SQL [%1]").arg(qs1));
                if(!qq1.exec(qs1)){
                    emit this->sigLog(MODNAME,MLog::logAlert,QString("error ")+ERR_SQLERR);
                    this->server->sendFault(id,ERR_SQLERR_ID,ERR_SQLERR);
                }else{
                // смотрим ответ
                    qq1.next();
                    int isOK = qq1.value(0).toInt();
                    if(isOK!=0){
                        // событие уже существует, бида пичаль, ругаем клиента
                        emit this->sigLog(MODNAME,MLog::logAlert,QString("error ")+ERR_EVENTEXIST);
                        this->server->sendFault(id,ERR_EVENTEXIST_ID,ERR_EVENTEXIST);
                    }else{
                // если пользователя нет, то добавляем
                QString qs2 = QString("insert into `events` (`name`,`text`,`event_dt`,`capacity`,`state`) values('%1','%2','%3',%4,%5)")
                        .arg(this->sqlsafe(ename))
                        .arg(this->sqlsafe(edesc))
                        .arg(this->sqlsafe(edate))
                        .arg(ecap)
                        .arg(estatus);
                QSqlQuery qq2;
                emit this->sigLog(MODNAME,MLog::logDebug,QString("SQL [%1]").arg(qs2));
                if(!qq2.exec(qs2)){
                    emit this->sigLog(MODNAME,MLog::logAlert,QString("error ")+ERR_SQLERR);
                    this->server->sendFault(id,ERR_SQLERR_ID,ERR_SQLERR);
                }else{
                    // вынимаем список включеных тарифов
                    QStringList a = parameters.at(0).toList().at(7).toString().split(",");
                    //qDebug()()<<a;


                    // в цикле добавляем тарифы
                    for(int i = 0; i < a.size() ; i++ ){
                        QString qs3 = QString("insert into `rsh_tariffs_events` set `id_tariffs` = (select `id` from `tariffs` where `name` = '%1') , `id_events` = ( select `id` from `events` where `name` = '%2' and `event_dt` = '%3') ")
                            .arg(a.at(i))
                            .arg(this->sqlsafe(ename))
                            .arg(this->sqlsafe(edate));
                    QSqlQuery qq3;
                    emit this->sigLog(MODNAME,MLog::logDebug,QString("SQL [%1]").arg(qs3));
                    if(!qq3.exec(qs3)){
                        emit this->sigLog(MODNAME,MLog::logAlert,QString("error ")+ERR_SQLERR);
                        this->server->sendFault(id,ERR_SQLERR_ID,ERR_SQLERR);
                        exit(0);
                    }else{

                    }
                }
                // отдаем клиенту ответ OK
                // формируем ответ
                QList<xmlrpc::Variant> ret;
                ret.append(QString("OK"));
                // отправляем ответ
                this->server->sendReturnValue(id,ret);
                emit this->sigLog(MODNAME,MLog::logInfo,QString("RPC stop adm.events.add USER=%2 SID=%3 HOST=%1").arg(host)
                                  .arg(parameters.at(0).toList().at(0).toString())
                                  .arg(parameters.at(0).toList().at(1).toString()));
                        }
                    }
                }
            }
        }}
    }


    //adm.events.edit - редактирование события - администратор
    if(methodName == "adm.events.edit"){
        emit this->sigLog(MODNAME,MLog::logInfo,QString("RPC start  adm.events.edit USER=%2 SID=%3 HOST=%1").arg(host)
                          .arg(parameters.at(0).toList().at(0).toString())
                          .arg(parameters.at(0).toList().at(1).toString()));
        // опапа прилетел запрос
        // сначала зачищаем сессии
        if(!this->clearOldSessions()){
                emit this->sigLog(MODNAME,MLog::logAlert,QString("error ")+ERR_SESSCLRERR);
                this->server->sendFault(id,ERR_SESSCLRERR_ID,ERR_SESSCLRERR);
        }else{

        // проверяем количество параметров - должно быть 10  имя пользователя и его хэш
        // старое имя события + старая дата события + имя события, описание, дата, объем и статус
        // + список включеных тарифов
        if(parameters.at(0).toList().size()!=10){
            // неверное количество параметров
            emit this->sigLog(MODNAME,MLog::logAlert,QString("error ")+ERR_PARAMSCOUNT);
            this->server->sendFault(id,ERR_PARAMSCOUNT_ID,ERR_PARAMSCOUNT);
        }else{
            // теперь проверяем наличие сессии данного пользователя в списке активных,
            // ежели нема ее там то кишь его кишь из работы, пущай перелогиниться.

            // вынимаем пользователя и хэш
            if(!this->testSesstion(parameters.at(0).toList().at(0).toString(),
                               parameters.at(0).toList().at(1).toString())){
                emit this->sigLog(MODNAME,MLog::logAlert,QString("error ")+ERR_SESSTESTERR);
                this->server->sendFault(id,ERR_SESSTESTERR_ID,ERR_SESSTESTERR);
            }else{
                // собственно делаем что надо
                // вынимаем данные
                QString oldename=parameters.at(0).toList().at(2).toString();
                QString oldedate=parameters.at(0).toList().at(3).toString();
                QString ename=parameters.at(0).toList().at(4).toString();
                QString edesc=parameters.at(0).toList().at(5).toString();
                QString edate=parameters.at(0).toList().at(6).toString();
                int ecap=parameters.at(0).toList().at(7).toInt();
                int estatus=parameters.at(0).toList().at(8).toInt();


                // обновляем список зависимостей
                // сначала все удалим
                QString qs3 = QString("delete from `rsh_tariffs_events` where `id_events` = (select `id` from `events` where `name` = '%1' and `event_dt` = '%2' )")
                        .arg(this->sqlsafe(oldename)).arg(this->sqlsafe(oldedate));
                QSqlQuery qq3;
                emit this->sigLog(MODNAME,MLog::logDebug,QString("SQL [%1]").arg(qs3));
                if(!qq3.exec(qs3)){
                    emit this->sigLog(MODNAME,MLog::logAlert,QString("error ")+ERR_SQLERR);
                    this->server->sendFault(id,ERR_SQLERR_ID,ERR_SQLERR);
                }else{


                // теперь построим заново
                    // вынимаем список включеных тарифов
                    QStringList a = parameters.at(0).toList().at(9).toString().split(",");
                    // в цикле добавляем тарифы
                    for(int i = 0; i < a.size() ; i++ ){
                        QString qs4 = QString("insert into `rsh_tariffs_events` set `id_tariffs` = (select `id` from `tariffs` where `name` = '%1') , `id_events` = ( select `id` from `events` where `name` = '%2' and `event_dt` = '%3') ")
                            .arg(a.at(i))
                            .arg(this->sqlsafe(oldename))
                            .arg(this->sqlsafe(oldedate));
                    QSqlQuery qq4;
                    emit this->sigLog(MODNAME,MLog::logDebug,QString("SQL [%1]").arg(qs4));
                    if(!qq4.exec(qs4)){
                        emit this->sigLog(MODNAME,MLog::logAlert,QString("error ")+ERR_SQLERR);
                        this->server->sendFault(id,ERR_SQLERR_ID,ERR_SQLERR);
                        exit(0);
                    }else{

                    }
                    }

                // обновляем событие
                QString qs1 = QString("update `events` set `name` = '%1' , `text` = '%2', `event_dt` = '%3' , `capacity` = %4 , `state` = %5 where `name` = '%6' and `event_dt` = '%7'")
                        .arg(this->sqlsafe(ename))
                        .arg(this->sqlsafe(edesc))
                        .arg(this->sqlsafe(edate))
                        .arg(ecap)
                        .arg(estatus)
                        .arg(this->sqlsafe(oldename))
                        .arg(this->sqlsafe(oldedate));
                QSqlQuery qq1;
                emit this->sigLog(MODNAME,MLog::logDebug,QString("SQL [%1]").arg(qs1));
                if(!qq1.exec(qs1)){
                    emit this->sigLog(MODNAME,MLog::logAlert,QString("error ")+ERR_SQLERR);
                    this->server->sendFault(id,ERR_SQLERR_ID,ERR_SQLERR);
                }else{
                // отдаем клиенту ответ OK
                // формируем ответ
                QList<xmlrpc::Variant> ret;
                ret.append(QString("OK"));
                // отправляем ответ
                this->server->sendReturnValue(id,ret);
                emit this->sigLog(MODNAME,MLog::logInfo,QString("RPC stop adm.events.edit USER=%2 SID=%3 HOST=%1").arg(host)
                                  .arg(parameters.at(0).toList().at(0).toString())
                                  .arg(parameters.at(0).toList().at(1).toString()));
                        }}
            }
        }}}


    // adm.events.del  - метод удаления события
    if(methodName == "adm.events.del"){
        emit this->sigLog(MODNAME,MLog::logInfo,QString("RPC start  adm.events.del USER=%2 SID=%3 HOST=%1").arg(host)
                          .arg(parameters.at(0).toList().at(0).toString())
                          .arg(parameters.at(0).toList().at(1).toString()));
        // опапа прилетел запрос
        // сначала зачищаем сессии
        if(!this->clearOldSessions()){
                emit this->sigLog(MODNAME,MLog::logAlert,QString("error ")+ERR_SESSCLRERR);
                this->server->sendFault(id,ERR_SESSCLRERR_ID,ERR_SESSCLRERR);
        }else{

        // проверяем количество параметров - должно быть 4  имя пользователя и его хэш
        // имя события + дата события
        if(parameters.at(0).toList().size()!=4){
            // неверное количество параметров
            emit this->sigLog(MODNAME,MLog::logAlert,QString("error ")+ERR_PARAMSCOUNT);
            this->server->sendFault(id,ERR_PARAMSCOUNT_ID,ERR_PARAMSCOUNT);
        }else{
            // теперь проверяем наличие сессии данного пользователя в списке активных,
            // ежели нема ее там то кишь его кишь из работы, пущай перелогиниться.

            // вынимаем пользователя и хэш
            if(!this->testSesstion(parameters.at(0).toList().at(0).toString(),
                               parameters.at(0).toList().at(1).toString())){
                emit this->sigLog(MODNAME,MLog::logAlert,QString("error ")+ERR_SESSTESTERR);
                this->server->sendFault(id,ERR_SESSTESTERR_ID,ERR_SESSTESTERR);
            }else{
                // собственно делаем что надо

                // вынимаем данные
                QString ename = parameters.at(0).toList().at(2).toString();
                QString edate = parameters.at(0).toList().at(3).toString();

                // удаляем все связи с тарифами
                QString qs3 = QString("delete from `rsh_tariffs_events` where `id_events` = (select `id` from `events` where `name` = '%1' and `event_dt` = '%2')")
                        .arg(this->sqlsafe(ename))
                        .arg(this->sqlsafe(edate));

                QSqlQuery qq3;
                emit this->sigLog(MODNAME,MLog::logDebug,QString("SQL [%1]").arg(qs3));
                if(!qq3.exec(qs3)){
                    emit this->sigLog(MODNAME,MLog::logAlert,QString("error ")+ERR_SQLERR);
                    this->server->sendFault(id,ERR_SQLERR_ID,ERR_SQLERR);
                }else{
                    // удаляем все связи с билетами
                    QString qs4 = QString("delete from `tickets` where `event_id` = (select `id` from `events` where `name` = '%1' and `event_dt` = '%2')")
                            .arg(this->sqlsafe(ename))
                            .arg(this->sqlsafe(edate));

                    QSqlQuery qq4;
                    emit this->sigLog(MODNAME,MLog::logDebug,QString("SQL [%1]").arg(qs4));
                    if(!qq4.exec(qs4)){
                        emit this->sigLog(MODNAME,MLog::logAlert,QString("error ")+ERR_SQLERR);
                        this->server->sendFault(id,ERR_SQLERR_ID,ERR_SQLERR);
                    }else{





                // удаляем само событие
                    QString qs3 = QString("delete from `events` where `name` = '%1' and `event_dt` = '%2'")
                            .arg(this->sqlsafe(ename))
                            .arg(this->sqlsafe(edate));

                    QSqlQuery qq3;
                    emit this->sigLog(MODNAME,MLog::logDebug,QString("SQL [%1]").arg(qs3));
                    if(!qq3.exec(qs3)){
                        emit this->sigLog(MODNAME,MLog::logAlert,QString("error ")+ERR_SQLERR);
                        this->server->sendFault(id,ERR_SQLERR_ID,ERR_SQLERR);
                    }else{


                // отдаем клиенту ответ OK
                // формируем ответ
                QList<xmlrpc::Variant> ret;
                ret.append(QString("OK"));
                // отправляем ответ
                this->server->sendReturnValue(id,ret);
                emit this->sigLog(MODNAME,MLog::logInfo,QString("RPC stop adm.events.del USER=%2 SID=%3 HOST=%1").arg(host)
                                  .arg(parameters.at(0).toList().at(0).toString())
                                  .arg(parameters.at(0).toList().at(1).toString()));
         }}}}}
     }
     }

    // adm.tariffs.getlist - метод получения списка пользователей
    if(methodName == "adm.tariffs.getlist"){
        emit this->sigLog(MODNAME,MLog::logInfo,QString("RPC start  adm.tariffs.getlist USER=%2 SID=%3 HOST=%1").arg(host)
                          .arg(parameters.at(0).toList().at(0).toString())
                          .arg(parameters.at(0).toList().at(1).toString()));
        // опапа прилетел запрос
        // сначала зачищаем сессии
        if(!this->clearOldSessions()){
                emit this->sigLog(MODNAME,MLog::logAlert,QString("error ")+ERR_SESSCLRERR);
                this->server->sendFault(id,ERR_SESSCLRERR_ID,ERR_SESSCLRERR);
        }else{

        // проверяем количество параметров - должно быть 2 имя пользователя и его хэш
        if(parameters.at(0).toList().size()!=2){
            // неверное количество параметров
            emit this->sigLog(MODNAME,MLog::logAlert,QString("error ")+ERR_PARAMSCOUNT);
            this->server->sendFault(id,ERR_PARAMSCOUNT_ID,ERR_PARAMSCOUNT);
        }else{
            // теперь проверяем наличие сессии данного пользователя в списке активных,
            // ежели нема ее там то кишь его кишь из работы, пущай перелогиниться.

            // вынимаем пользователя и хэш
            if(!this->testSesstion(parameters.at(0).toList().at(0).toString(),
                               parameters.at(0).toList().at(1).toString())){
                emit this->sigLog(MODNAME,MLog::logAlert,QString("error ")+ERR_SESSTESTERR);
                this->server->sendFault(id,ERR_SESSTESTERR_ID,ERR_SESSTESTERR);
            }else{
                // сессию обновили успешно, идем дальше.
                // необходимо получить список тарифов

                QString qstr="select `name`,`cost` from `tariffs` order by `name`";
                QSqlQuery q1;
                emit this->sigLog(MODNAME,MLog::logDebug,QString("SQL [%1]").arg(qstr));
                if(!q1.exec(qstr)){
                    emit this->sigLog(MODNAME,MLog::logAlert,QString("error ")+ERR_SQLERR);
                    this->server->sendFault(id,ERR_SQLERR_ID,ERR_SQLERR);
                }else{
                    // формируем ответ
                    QList<xmlrpc::Variant> ret;
                    while(q1.next()){
                        ret.append(q1.value(0).toString());
                        ret.append(q1.value(1).toInt());
                    }
                    // отправляем ответ
                    this->server->sendReturnValue(id,ret);
                    emit this->sigLog(MODNAME,MLog::logInfo,QString("RPC stop adm.tariffs.getlist USER=%2 SID=%3 HOST=%1").arg(host)
                                      .arg(parameters.at(0).toList().at(0).toString())
                                      .arg(parameters.at(0).toList().at(1).toString()));
                }
            }
        }
        }
    }

    // adm.tariffs.getlist_for_events - метод получения списка пользователей
    if(methodName == "adm.tariffs.getlist_for_events"){
        emit this->sigLog(MODNAME,MLog::logInfo,QString("RPC start   adm.tariffs.getlist_for_events USER=%2 SID=%3 HOST=%1").arg(host)
                          .arg(parameters.at(0).toList().at(0).toString())
                          .arg(parameters.at(0).toList().at(1).toString()));
        // опапа прилетел запрос
        // сначала зачищаем сессии
        if(!this->clearOldSessions()){
                emit this->sigLog(MODNAME,MLog::logAlert,QString("error ")+ERR_SESSCLRERR);
                this->server->sendFault(id,ERR_SESSCLRERR_ID,ERR_SESSCLRERR);
        }else{

        // проверяем количество параметров - должно быть 2 имя пользователя и его хэш
        if(parameters.at(0).toList().size()!=2){
            // неверное количество параметров
            emit this->sigLog(MODNAME,MLog::logAlert,QString("error ")+ERR_PARAMSCOUNT);
            this->server->sendFault(id,ERR_PARAMSCOUNT_ID,ERR_PARAMSCOUNT);
        }else{
            // теперь проверяем наличие сессии данного пользователя в списке активных,
            // ежели нема ее там то кишь его кишь из работы, пущай перелогиниться.

            // вынимаем пользователя и хэш
            if(!this->testSesstion(parameters.at(0).toList().at(0).toString(),
                               parameters.at(0).toList().at(1).toString())){
                emit this->sigLog(MODNAME,MLog::logAlert,QString("error ")+ERR_SESSTESTERR);
                this->server->sendFault(id,ERR_SESSTESTERR_ID,ERR_SESSTESTERR);
            }else{
                // сессию обновили успешно, идем дальше.
                // необходимо получить список тарифов

                QString qstr="select `name`,`cost` from `tariffs` order by `name`";
                QSqlQuery q1;
                emit this->sigLog(MODNAME,MLog::logDebug,QString("SQL [%1]").arg(qstr));
                if(!q1.exec(qstr)){
                    emit this->sigLog(MODNAME,MLog::logAlert,QString("error ")+ERR_SQLERR);
                    this->server->sendFault(id,ERR_SQLERR_ID,ERR_SQLERR);
                }else{
                    // формируем ответ
                    QList<xmlrpc::Variant> ret;
                    while(q1.next()){
                        ret.append(q1.value(0).toString());
                        ret.append(q1.value(1).toInt());
                    }
                    // отправляем ответ
                    this->server->sendReturnValue(id,ret);
                    emit this->sigLog(MODNAME,MLog::logInfo,QString("RPC stop adm.tariffs.getlist_for_events USER=%2 SID=%3 HOST=%1").arg(host)
                                      .arg(parameters.at(0).toList().at(0).toString())
                                      .arg(parameters.at(0).toList().at(1).toString()));
                }
            }
        }
        }
    }

    // adm.tariffs.getlist_aa
    if(methodName == "adm.tariffs.getlist_aa"){
        emit this->sigLog(MODNAME,MLog::logInfo,QString("RPC start  adm.tariffs.getlist_aa USER=%2 SID=%3 HOST=%1").arg(host)
                          .arg(parameters.at(0).toList().at(0).toString())
                          .arg(parameters.at(0).toList().at(1).toString()));
        // опапа прилетел запрос
        // сначала зачищаем сессии
        if(!this->clearOldSessions()){
                emit this->sigLog(MODNAME,MLog::logAlert,QString("error ")+ERR_SESSCLRERR);
                this->server->sendFault(id,ERR_SESSCLRERR_ID,ERR_SESSCLRERR);
        }else{

        // проверяем количество параметров - должно быть 2 имя пользователя и его хэш
        if(parameters.at(0).toList().size()!=2){
            // неверное количество параметров
            emit this->sigLog(MODNAME,MLog::logAlert,QString("error ")+ERR_PARAMSCOUNT);
            this->server->sendFault(id,ERR_PARAMSCOUNT_ID,ERR_PARAMSCOUNT);
        }else{
            // теперь проверяем наличие сессии данного пользователя в списке активных,
            // ежели нема ее там то кишь его кишь из работы, пущай перелогиниться.

            // вынимаем пользователя и хэш
            if(!this->testSesstion(parameters.at(0).toList().at(0).toString(),
                               parameters.at(0).toList().at(1).toString())){
                emit this->sigLog(MODNAME,MLog::logAlert,QString("error ")+ERR_SESSTESTERR);
                this->server->sendFault(id,ERR_SESSTESTERR_ID,ERR_SESSTESTERR);
            }else{
                // сессию обновили успешно, идем дальше.
                // необходимо получить список тарифов

                QString qstr="select `name`,`cost` from `tariffs` order by `name`";
                QSqlQuery q1;
                emit this->sigLog(MODNAME,MLog::logDebug,QString("SQL [%1]").arg(qstr));
                if(!q1.exec(qstr)){
                    emit this->sigLog(MODNAME,MLog::logAlert,QString("error ")+ERR_SQLERR);
                    this->server->sendFault(id,ERR_SQLERR_ID,ERR_SQLERR);
                }else{
                    // формируем ответ
                    QList<xmlrpc::Variant> ret;
                    while(q1.next()){
                        ret.append(q1.value(0).toString());
                        ret.append(q1.value(1).toInt());
                    }
                    // отправляем ответ
                    this->server->sendReturnValue(id,ret);
                    emit this->sigLog(MODNAME,MLog::logInfo,QString("RPC stop adm.tariffs.getlist_aa USER=%2 SID=%3 HOST=%1").arg(host)
                                      .arg(parameters.at(0).toList().at(0).toString())
                                      .arg(parameters.at(0).toList().at(1).toString()));
                }
            }
        }
        }
    }

    // adm.tariffs.getlist_ab
    if(methodName == "adm.tariffs.getlist_ab"){
        emit this->sigLog(MODNAME,MLog::logInfo,QString("RPC start   adm.tariffs.getlist_ab USER=%2 SID=%3 HOST=%1").arg(host)
                          .arg(parameters.at(0).toList().at(0).toString())
                          .arg(parameters.at(0).toList().at(1).toString()));
        // опапа прилетел запрос
        // сначала зачищаем сессии
        if(!this->clearOldSessions()){
                emit this->sigLog(MODNAME,MLog::logAlert,QString("error ")+ERR_SESSCLRERR);
                this->server->sendFault(id,ERR_SESSCLRERR_ID,ERR_SESSCLRERR);
        }else{

        // проверяем количество параметров - должно быть 4 имя пользователя и его хэш
        // имя события и его дата
        if(parameters.at(0).toList().size()!=4){
            // неверное количество параметров
            emit this->sigLog(MODNAME,MLog::logAlert,QString("error ")+ERR_PARAMSCOUNT);
            this->server->sendFault(id,ERR_PARAMSCOUNT_ID,ERR_PARAMSCOUNT);
        }else{
            // теперь проверяем наличие сессии данного пользователя в списке активных,
            // ежели нема ее там то кишь его кишь из работы, пущай перелогиниться.

            // вынимаем пользователя и хэш
            if(!this->testSesstion(parameters.at(0).toList().at(0).toString(),
                               parameters.at(0).toList().at(1).toString())){
                emit this->sigLog(MODNAME,MLog::logAlert,QString("error ")+ERR_SESSTESTERR);
                this->server->sendFault(id,ERR_SESSTESTERR_ID,ERR_SESSTESTERR);
            }else{
                // сессию обновили успешно, идем дальше.
                // необходимо получить список тарифов
                QString ename = parameters.at(0).toList().at(2).toString();
                QString edate = parameters.at(0).toList().at(3).toString();
                QString qstr= QString("select `tariffs`.`name` from `tariffs`,`rsh_tariffs_events`,`events` where `tariffs`.`id` = `rsh_tariffs_events`.`id_tariffs` and `events`.`id` = `rsh_tariffs_events`.`id_events` and `events`.`name` = '%1'  and `events`.`event_dt` = '%2'")
                        .arg(this->sqlsafe(ename))
                        .arg(this->sqlsafe(edate));
                QSqlQuery q1;
                emit this->sigLog(MODNAME,MLog::logDebug,QString("SQL [%1]").arg(qstr));
                if(!q1.exec(qstr)){
                    emit this->sigLog(MODNAME,MLog::logAlert,QString("error ")+ERR_SQLERR);
                    this->server->sendFault(id,ERR_SQLERR_ID,ERR_SQLERR);
                }else{
                    // формируем ответ
                    QList<xmlrpc::Variant> ret;
                    while(q1.next()){
                        ret.append(q1.value(0).toString());
                    }
                    // отправляем ответ
                    this->server->sendReturnValue(id,ret);
                    emit this->sigLog(MODNAME,MLog::logInfo,QString("RPC stop adm.tariffs.getlist_ab USER=%2 SID=%3 HOST=%1").arg(host)
                                      .arg(parameters.at(0).toList().at(0).toString())
                                      .arg(parameters.at(0).toList().at(1).toString()));
                }
            }
        }
        }
    }


    //adm.tariffs.add - добавление нового тарифа - администратор
    if(methodName == "adm.tariffs.add"){
        emit this->sigLog(MODNAME,MLog::logInfo,QString("RPC start  adm.tariffs.add USER=%2 SID=%3 HOST=%1").arg(host)
                          .arg(parameters.at(0).toList().at(0).toString())
                          .arg(parameters.at(0).toList().at(1).toString()));
        // опапа прилетел запрос
        // сначала зачищаем сессии
        if(!this->clearOldSessions()){
                emit this->sigLog(MODNAME,MLog::logAlert,QString("error ")+ERR_SESSCLRERR);
                this->server->sendFault(id,ERR_SESSCLRERR_ID,ERR_SESSCLRERR);
        }else{

        // проверяем количество параметров - должно быть 4  имя пользователя и его хэш
        // имя тарифа и его цена
        if(parameters.at(0).toList().size()!=4){
            // неверное количество параметров
            emit this->sigLog(MODNAME,MLog::logAlert,QString("error ")+ERR_PARAMSCOUNT);
            this->server->sendFault(id,ERR_PARAMSCOUNT_ID,ERR_PARAMSCOUNT);
        }else{
            // теперь проверяем наличие сессии данного пользователя в списке активных,
            // ежели нема ее там то кишь его кишь из работы, пущай перелогиниться.

            // вынимаем пользователя и хэш
            if(!this->testSesstion(parameters.at(0).toList().at(0).toString(),
                               parameters.at(0).toList().at(1).toString())){
                emit this->sigLog(MODNAME,MLog::logAlert,QString("error ")+ERR_SESSTESTERR);
                this->server->sendFault(id,ERR_SESSTESTERR_ID,ERR_SESSTESTERR);
            }else{
                // собственно делаем что надо
                // вынимаем данные
                QString tname=parameters.at(0).toList().at(2).toString();
                int tcost=parameters.at(0).toList().at(3).toInt();

                // проверяем наличие тарифа с таким же именем
                QString qs1=QString("select count(*) from `tariffs` where `name`='%1'")
                        .arg(this->sqlsafe(tname));
                QSqlQuery qq1;
                emit this->sigLog(MODNAME,MLog::logDebug,QString("SQL [%1]").arg(qs1));
                if(!qq1.exec(qs1)){
                    emit this->sigLog(MODNAME,MLog::logAlert,QString("error ")+ERR_SQLERR);
                    this->server->sendFault(id,ERR_SQLERR_ID,ERR_SQLERR);
                }else{
                // смотрим ответ
                    qq1.next();
                    int isOK = qq1.value(0).toInt();
                    if(isOK!=0){
                        // тариф уже существует, бида пичаль, ругаем клиента
                        emit this->sigLog(MODNAME,MLog::logAlert,QString("error ")+ERR_TARIFFEXIST);
                        this->server->sendFault(id,ERR_TARIFFEXIST_ID,ERR_TARIFFEXIST);
                    }else{
                // если тарифа нет, то добавляем
                QString qs2 = QString("insert into `tariffs` (`name`,`cost`) values('%1',%2)")
                        .arg(this->sqlsafe(tname))
                        .arg(tcost);
                QSqlQuery qq2;
                emit this->sigLog(MODNAME,MLog::logDebug,QString("SQL [%1]").arg(qs2));
                if(!qq2.exec(qs2)){
                    emit this->sigLog(MODNAME,MLog::logAlert,QString("error ")+ERR_SQLERR);
                    this->server->sendFault(id,ERR_SQLERR_ID,ERR_SQLERR);
                }else{
                // отдаем клиенту ответ OK
                // формируем ответ
                QList<xmlrpc::Variant> ret;
                ret.append(QString("OK"));
                // отправляем ответ
                this->server->sendReturnValue(id,ret);
                emit this->sigLog(MODNAME,MLog::logInfo,QString("RPC stop adm.tariffs.add USER=%2 SID=%3 HOST=%1").arg(host)
                                  .arg(parameters.at(0).toList().at(0).toString())
                                  .arg(parameters.at(0).toList().at(1).toString()));
                        }
                    }
                }
            }
        }}
    }


    // adm.tariffs.edit - метод модификации тарифа
    if(methodName == "adm.tariffs.edit"){
        emit this->sigLog(MODNAME,MLog::logInfo,QString("RPC start  adm.tariffs.edit USER=%2 SID=%3 HOST=%1").arg(host)
                          .arg(parameters.at(0).toList().at(0).toString())
                          .arg(parameters.at(0).toList().at(1).toString()));
        // опапа прилетел запрос
        // сначала зачищаем сессии
        if(!this->clearOldSessions()){
                emit this->sigLog(MODNAME,MLog::logAlert,QString("error ")+ERR_SESSCLRERR);
                this->server->sendFault(id,ERR_SESSCLRERR_ID,ERR_SESSCLRERR);
        }else{

        // проверяем количество параметров - должно быть 5 имя пользователя и его хэш
        // старое имя тарифа и новое + стоимость
        if(parameters.at(0).toList().size()!=5){
            // неверное количество параметров
            emit this->sigLog(MODNAME,MLog::logAlert,QString("error ")+ERR_PARAMSCOUNT);
            this->server->sendFault(id,ERR_PARAMSCOUNT_ID,ERR_PARAMSCOUNT);
        }else{
            // теперь проверяем наличие сессии данного пользователя в списке активных,
            // ежели нема ее там то кишь его кишь из работы, пущай перелогиниться.

            // вынимаем пользователя и хэш
            if(!this->testSesstion(parameters.at(0).toList().at(0).toString(),
                               parameters.at(0).toList().at(1).toString())){
                emit this->sigLog(MODNAME,MLog::logAlert,QString("error ")+ERR_SESSTESTERR);
                this->server->sendFault(id,ERR_SESSTESTERR_ID,ERR_SESSTESTERR);
            }else{
                // собственно делаем что надо

                // вынимаем данные
                QString oldtname=parameters.at(0).toList().at(2).toString();
                QString tname=parameters.at(0).toList().at(3).toString();
                int tcost=parameters.at(0).toList().at(4).toInt();
                // формируем запрос
                QString qs1=QString("update `tariffs` set `name`='%1', `cost` = %2 where `name` = '%3' ")
                        .arg(this->sqlsafe(tname))
                        .arg(tcost)
                        .arg(this->sqlsafe(oldtname));

                // стучимся в базу
                QSqlQuery qq1;
                emit this->sigLog(MODNAME,MLog::logDebug,QString("SQL [%1]").arg(qs1));
                if(!qq1.exec(qs1)){
                    emit this->sigLog(MODNAME,MLog::logAlert,QString("error ")+ERR_SQLERR);
                    this->server->sendFault(id,ERR_SQLERR_ID,ERR_SQLERR);
                }else{
                    // отдаем клиенту ответ OK
                    // формируем ответ
                    QList<xmlrpc::Variant> ret;
                    ret.append(QString("OK"));
                    // отправляем ответ
                    this->server->sendReturnValue(id,ret);

                emit this->sigLog(MODNAME,MLog::logInfo,QString("RPC stop adm.tariffs.edit USER=%2 SID=%3 HOST=%1").arg(host)
                                  .arg(parameters.at(0).toList().at(0).toString())
                                  .arg(parameters.at(0).toList().at(1).toString()));
                }
            }
        }}
    }


    // adm.tariffs.del - метод удаления тарифа
    if(methodName == "adm.tariffs.del"){
        emit this->sigLog(MODNAME,MLog::logInfo,QString("RPC start  adm.tariffs.add USER=%2 SID=%3 HOST=%1").arg(host)
                          .arg(parameters.at(0).toList().at(0).toString())
                          .arg(parameters.at(0).toList().at(1).toString()));
        // опапа прилетел запрос
        // сначала зачищаем сессии
        if(!this->clearOldSessions()){
                emit this->sigLog(MODNAME,MLog::logAlert,QString("error ")+ERR_SESSCLRERR);
                this->server->sendFault(id,ERR_SESSCLRERR_ID,ERR_SESSCLRERR);
        }else{

        // проверяем количество параметров - должно быть 3 имя тарифа и его хэш
        // имя удаляемого тарифа
        if(parameters.at(0).toList().size()!=3){
            // неверное количество параметров
            emit this->sigLog(MODNAME,MLog::logAlert,QString("error ")+ERR_PARAMSCOUNT);
            this->server->sendFault(id,ERR_PARAMSCOUNT_ID,ERR_PARAMSCOUNT);
        }else{
            // теперь проверяем наличие сессии данного пользователя в списке активных,
            // ежели нема ее там то кишь его кишь из работы, пущай перелогиниться.

            // вынимаем пользователя и хэш
            if(!this->testSesstion(parameters.at(0).toList().at(0).toString(),
                               parameters.at(0).toList().at(1).toString())){
                emit this->sigLog(MODNAME,MLog::logAlert,QString("error ")+ERR_SESSTESTERR);
                this->server->sendFault(id,ERR_SESSTESTERR_ID,ERR_SESSTESTERR);
            }else{
                // собственно делаем что надо
                // удаляем связь этого тарифа с событиями

                // вынимаем имя удаляемого тарифа
                    QString tname = parameters.at(0).toList().at(2).toString();
                QString qs3 = QString("delete from `rsh_tariffs_events` where `id_tariffs` = (select `id` from `tariffs` where `name` = '%1')")
                        .arg(this->sqlsafe(tname));

                QSqlQuery qq3;
                emit this->sigLog(MODNAME,MLog::logDebug,QString("SQL [%1]").arg(qs3));
                if(!qq3.exec(qs3)){
                    emit this->sigLog(MODNAME,MLog::logAlert,QString("error ")+ERR_SQLERR);
                    this->server->sendFault(id,ERR_SQLERR_ID,ERR_SQLERR);
                }else{


                // удаляем тариф
                QString qs1=QString("delete from `tariffs` where `name`='%1'")
                        .arg(this->sqlsafe(tname));
               emit this->sigLog(MODNAME,MLog::logDebug,QString("SQL [%1]").arg(qs1));
                QSqlQuery qq1;
                if(!qq1.exec(qs1)){
                    emit this->sigLog(MODNAME,MLog::logAlert,QString("error ")+ERR_SQLERR);
                    this->server->sendFault(id,ERR_SQLERR_ID,ERR_SQLERR);
                }else{
                    // отдаем клиенту ответ OK
                    // формируем ответ
                    QList<xmlrpc::Variant> ret;
                    ret.append(QString("OK"));
                    // отправляем ответ
                    this->server->sendReturnValue(id,ret);

                emit this->sigLog(MODNAME,MLog::logInfo,QString("RPC stop adm.tariffs.del USER=%2 SID=%3 HOST=%1").arg(host)
                                  .arg(parameters.at(0).toList().at(0).toString())
                                  .arg(parameters.at(0).toList().at(1).toString()));
                }}
            }
        }}
    }

    // user.events.getlist - получение списка событий для пользователя
    if(methodName == "user.events.getlist"){
        emit this->sigLog(MODNAME,MLog::logInfo,QString("RPC start  user.events.getlist USER=%2 SID=%3 HOST=%1").arg(host)
                          .arg(parameters.at(0).toList().at(0).toString())
                          .arg(parameters.at(0).toList().at(1).toString()));
        // опапа прилетел запрос
        // сначала зачищаем сессии
        if(!this->clearOldSessions()){
                emit this->sigLog(MODNAME,MLog::logAlert,QString("error ")+ERR_SESSCLRERR);
                this->server->sendFault(id,ERR_SESSCLRERR_ID,ERR_SESSCLRERR);
        }else{

        // проверяем количество параметров - должно быть 4 имя пользователя и его хэш
        // дата начала и дата конца
        if(parameters.at(0).toList().size()!=4){
            // неверное количество параметров
            emit this->sigLog(MODNAME,MLog::logAlert,QString("error ")+ERR_PARAMSCOUNT);
            this->server->sendFault(id,ERR_PARAMSCOUNT_ID,ERR_PARAMSCOUNT);
        }else{
            // теперь проверяем наличие сессии данного пользователя в списке активных,
            // ежели нема ее там то кишь его кишь из работы, пущай перелогиниться.

            // вынимаем пользователя и хэш
            if(!this->testSesstion(parameters.at(0).toList().at(0).toString(),
                               parameters.at(0).toList().at(1).toString())){
                emit this->sigLog(MODNAME,MLog::logAlert,QString("error ")+ERR_SESSTESTERR);
                this->server->sendFault(id,ERR_SESSTESTERR_ID,ERR_SESSTESTERR);
            }else{
                // собственно делаем что надо
                // вынимаем дату начала и конца
                QString d_de=parameters.at(0).toList().at(2).toString();
                QString d_gxis=parameters.at(0).toList().at(3).toString();
                // наша задача получить список событий, выбрать из него дату, вместимость и имя
                // потом для каждого списка запросить количество уже проданных билетов для этого события
                // и посчитать остаток билетов


                QString qs1=QString("select `event_dt`,`capacity`,`name`,`text` from `events` ")+
                        QString("where `event_dt` > '%1' and `event_dt` < '%2' ")
                        .arg(this->sqlsafe(d_de))
                        .arg(this->sqlsafe(d_gxis))+
                        QString(" and `state` = 0 order by `event_dt` ");
                QSqlQuery qq1;
                emit this->sigLog(MODNAME,MLog::logDebug,QString("SQL [%1]").arg(qs1));
                if(!qq1.exec(qs1)){
                    emit this->sigLog(MODNAME,MLog::logAlert,QString("error ")+ERR_SQLERR);
                    this->server->sendFault(id,ERR_SQLERR_ID,ERR_SQLERR);
                }else{
                    // формируем ответ
                    QList<xmlrpc::Variant> ret;
                    while(qq1.next()){
                        QString dt=qq1.value(0).toDateTime().toString("yyyy-MM-dd hh:mm:ss");
                        QString en=qq1.value(2).toString();
                        int capcap = qq1.value(1).toInt();
                        ret.append(dt);
                        ret.append(capcap);
                        ret.append(en);
                        ret.append(qq1.value(3).toString());
                        // запрос на количество уже проданных билетов,
                        // далее отнимаем от емкости и получаем количество еще не проданных

                        QString qs2=QString("select count(*) from `tickets`, `events` where `tickets`.`event_id` = `events`.`id` and `events`.`name` = '%1' and `event_dt` = '%2' and `tickets`.`status` = 0")
                                .arg(en)
                                .arg(this->sqlsafe(dt));
                        QSqlQuery qq2;

                        emit this->sigLog(MODNAME,MLog::logDebug,QString("SQL [%1]").arg(qs2));
                        if(!qq2.exec(qs2)){
                            emit this->sigLog(MODNAME,MLog::logAlert,QString("error ")+ERR_SQLERR);
                            this->server->sendFault(id,ERR_SQLERR_ID,ERR_SQLERR);
                        }else{
                            qq2.next();
                            int balance = capcap - qq2.value(0).toInt();
                            ret.append(balance);
                        }

                    }
                    // отправляем ответ
                    this->server->sendReturnValue(id,ret);
                emit this->sigLog(MODNAME,MLog::logInfo,QString("RPC stop user.events.getlist USER=%2 SID=%3 HOST=%1").arg(host)
                                  .arg(parameters.at(0).toList().at(0).toString())
                                  .arg(parameters.at(0).toList().at(1).toString()));
                }
            }
        }}
    }

    // user.tariffs.getlist - получение списка тарифов для продажи билета

    if(methodName == "user.tariffs.getlist"){
        emit this->sigLog(MODNAME,MLog::logInfo,QString("RPC start  user.tariffs.getlist USER=%2 SID=%3 HOST=%1").arg(host)
                          .arg(parameters.at(0).toList().at(0).toString())
                          .arg(parameters.at(0).toList().at(1).toString()));
        // опапа прилетел запрос
        // сначала зачищаем сессии
        if(!this->clearOldSessions()){
                emit this->sigLog(MODNAME,MLog::logAlert,QString("error ")+ERR_SESSCLRERR);
                this->server->sendFault(id,ERR_SESSCLRERR_ID,ERR_SESSCLRERR);
        }else{

        // проверяем количество параметров - должно быть 4 имя пользователя и его хэш
        // имя события и дата
        if(parameters.at(0).toList().size()!=4){
            // неверное количество параметров
            emit this->sigLog(MODNAME,MLog::logAlert,QString("error ")+ERR_PARAMSCOUNT);
            this->server->sendFault(id,ERR_PARAMSCOUNT_ID,ERR_PARAMSCOUNT);
        }else{
            // теперь проверяем наличие сессии данного пользователя в списке активных,
            // ежели нема ее там то кишь его кишь из работы, пущай перелогиниться.

            // вынимаем пользователя и хэш
            if(!this->testSesstion(parameters.at(0).toList().at(0).toString(),
                               parameters.at(0).toList().at(1).toString())){
                emit this->sigLog(MODNAME,MLog::logAlert,QString("error ")+ERR_SESSTESTERR);
                this->server->sendFault(id,ERR_SESSTESTERR_ID,ERR_SESSTESTERR);
            }else{
                // собственно делаем что надо
                // вынимаем дату начала и конца
                QString ename=parameters.at(0).toList().at(2).toString();
                QString edate=parameters.at(0).toList().at(3).toString();
                // наша задача получить список тарифов для текущего события

                QString qs1 = QString("select `tariffs`.`name`,`tariffs`.`cost` from `tariffs`,`events`,`rsh_tariffs_events` ")+
                        QString("where `rsh_tariffs_events`.`id_tariffs` = `tariffs`.`id` and `rsh_tariffs_events`.`id_events`=`events`.`id`")+
                        QString(" and `events`.`name` = '%1' and `events`.`event_dt`='%2'")
                        .arg(this->sqlsafe(ename)).arg(this->sqlsafe(edate));

                QSqlQuery qq1;
                emit this->sigLog(MODNAME,MLog::logDebug,QString("SQL [%1]").arg(qs1));
                if(!qq1.exec(qs1)){
                    emit this->sigLog(MODNAME,MLog::logAlert,QString("error ")+ERR_SQLERR);
                    this->server->sendFault(id,ERR_SQLERR_ID,ERR_SQLERR);
                }else{
                    // формируем ответ
                    QList<xmlrpc::Variant> ret;
                    while(qq1.next()){
                        ret.append(qq1.value(0).toString());
                        ret.append(qq1.value(1).toString());
                    }
                    // отправляем ответ
                    this->server->sendReturnValue(id,ret);
                emit this->sigLog(MODNAME,MLog::logInfo,QString("RPC stop user.tariffs.getlist USER=%2 SID=%3 HOST=%1").arg(host)
                                  .arg(parameters.at(0).toList().at(0).toString())
                                  .arg(parameters.at(0).toList().at(1).toString()));
                }
            }
        }}
    }

    // user.ticket.sale
    if(methodName == "user.ticket.sale"){
        emit this->sigLog(MODNAME,MLog::logInfo,QString("RPC start  user.ticket.sale USER=%2 SID=%3 HOST=%1").arg(host)
                          .arg(parameters.at(0).toList().at(0).toString())
                          .arg(parameters.at(0).toList().at(1).toString()));
        // опапа прилетел запрос
        // сначала зачищаем сессии
        if(!this->clearOldSessions()){
                emit this->sigLog(MODNAME,MLog::logAlert,QString("error ")+ERR_SESSCLRERR);
                this->server->sendFault(id,ERR_SESSCLRERR_ID,ERR_SESSCLRERR);
        }else{

        // проверяем количество параметров - должно быть 6 имя пользователя и его хэш
        // имя события и его дата + наименование тарифа и цена билета
        if(parameters.at(0).toList().size()!=6){
            // неверное количество параметров
            emit this->sigLog(MODNAME,MLog::logAlert,QString("error ")+ERR_PARAMSCOUNT);
            this->server->sendFault(id,ERR_PARAMSCOUNT_ID,ERR_PARAMSCOUNT);
        }else{
            // теперь проверяем наличие сессии данного пользователя в списке активных,
            // ежели нема ее там то кишь его кишь из работы, пущай перелогиниться.

            // вынимаем пользователя и хэш
            if(!this->testSesstion(parameters.at(0).toList().at(0).toString(),
                               parameters.at(0).toList().at(1).toString())){
                emit this->sigLog(MODNAME,MLog::logAlert,QString("error ")+ERR_SESSTESTERR);
                this->server->sendFault(id,ERR_SESSTESTERR_ID,ERR_SESSTESTERR);
            }else{
                // собственно делаем что надо
                // вынимаем дату начала и конца
                QString ename=parameters.at(0).toList().at(2).toString();
                QString edate=parameters.at(0).toList().at(3).toString();
                // наша задача зафиксировать продажу билета, потом проверить не привысили ли мы лимит
                // количества билетов для этого события
                emit this->sigLog(MODNAME,MLog::logDebug,QString("start transaction"));
                if(!this->db.transaction()){
                    // не получилось начать транзакцию, все бида
                    emit this->sigLog(MODNAME,MLog::logAlert,QString("error ")+ERR_SESSTESTERR);
                    this->server->sendFault(id,ERR_SESSTESTERR_ID,ERR_SESSTESTERR);
                }else{
                    // запрос проверяющий есть ли еще место для нового билета
                    QString qs1 = QString("select `events`.`capacity` -  \
                                          (select count(*) from `tickets` where `status` = 0 and  `tickets`.`event_id` =\
                            (select `events`.`id` from `events` where `name` = '%1' and `event_dt` = '%2')) \
                                          from `events` where `name` = '%1' and `event_dt` = '%2'")
                            .arg(this->sqlsafe(ename)).arg(this->sqlsafe(edate));
                    // делаем запрос, если циферка меньше 1 значит ролбек с ататат
                    QSqlQuery qq1;
                    emit this->sigLog(MODNAME,MLog::logDebug,QString("SQL [%1]").arg(qs1));
                    if(!qq1.exec(qs1)){
                        emit this->sigLog(MODNAME,MLog::logAlert,QString("error ")+ERR_SQLERR);
                        this->server->sendFault(id,ERR_SQLERR_ID,ERR_SQLERR);
                    }else{
                        // проверяем циферку
                        qq1.next();
                        //qDebug()()<<"DDD - "<<qq1.value(0).toInt();
                        if(qq1.value(0).toInt() < 1){
                            // ох печалька печалька, кто то перехватил свободный билет. откатываемся
                            if(!this->db.rollback()){
                                // вот же блять, и ролбек не сработал, ругаемся в темную голову.
                                emit this->sigLog(MODNAME,MLog::logAlert,QString("error ")+ERR_SQLERR);
                                this->server->sendFault(id,ERR_SQLERR_ID,ERR_SQLERR);
                            }else{
                                // откатились высыпаем ошибку
                                emit this->sigLog(MODNAME,MLog::logAlert,QString("error ")+ERR_BALANCEFAIL);
                                this->server->sendFault(id,ERR_BALANCEFAIL_ID,ERR_BALANCEFAIL);
                            }
                        }else{
                            // фиксируем продажу билета
                            // гененируем TUID для билета
                            QString tuid = QString::number(QDateTime::currentMSecsSinceEpoch());
                            QString qs2 = QString("insert into `tickets` (`event_id`,`user_id`,`sale_date`,`tariff_name`,`cost`,`tuid`) values((select `events`.`id` from `events` where `events`.`name` = '%1' and `events`.`event_dt` = '%2'), (select `users`.`id` from `users` where `users`.`username` = '%3' and `users`.`state` = 1), NOW(), '%4', %5,'%6' )")
                                    .arg(this->sqlsafe(ename))
                                    .arg(this->sqlsafe(edate))
                                    .arg(this->sqlsafe(parameters.at(0).toList().at(0).toString()))
                                    .arg(this->sqlsafe(parameters.at(0).toList().at(4).toString()))
                                    .arg(this->sqlsafe(parameters.at(0).toList().at(5).toString()))
                                    .arg(this->sqlsafe(tuid));
                            QSqlQuery qq2;
                            emit this->sigLog(MODNAME,MLog::logDebug,QString("SQL [%1]").arg(qs2));
                            if(!qq1.exec(qs2)){
                                emit this->sigLog(MODNAME,MLog::logAlert,QString("error ")+ERR_SQLERR);
                                this->server->sendFault(id,ERR_SQLERR_ID,ERR_SQLERR);
                            }else{
                                // делаем проверку  на переполнение
                                QString qs3 = QString("select `events`.`capacity` -  (select count(*) from `tickets` where `status` = 0 and `tickets`.`event_id` = (select `events`.`id` from `events` where `name` = '%1' and `event_dt` = '%2')),(select count(*) from `tickets` where `tickets`.`event_id` = (select `events`.`id` from `events` where `name` = '%1' and `event_dt` = '%2')) from `events` where `name` = '%1' and `event_dt` = '%2'")
                                        .arg(this->sqlsafe(ename)).arg(this->sqlsafe(edate));
                                // делаем запрос, если циферка меньше 0 значит ролбек с ататат
                                QSqlQuery qq3;
                                emit this->sigLog(MODNAME,MLog::logDebug,QString("SQL [%1]").arg(qs3));
                                if(!qq3.exec(qs3)){
                                    emit this->sigLog(MODNAME,MLog::logAlert,QString("error ")+ERR_SQLERR);
                                    this->server->sendFault(id,ERR_SQLERR_ID,ERR_SQLERR);
                                }else{
                                    // проверяем циферку
                                    qq3.next();
                                    if(qq3.value(0).toInt() < 0){
                                        // ох печалька печалька, кто то перехватил свободный билет. откатываемся
                                        if(!this->db.rollback()){
                                            // вот же блять, и ролбек не сработал, ругаемся в темную голову.
                                            emit this->sigLog(MODNAME,MLog::logAlert,QString("error ")+ERR_SQLERR);
                                            this->server->sendFault(id,ERR_SQLERR_ID,ERR_SQLERR);
                                        }else{
                                            // откатились высыпаем ошибку
                                            emit this->sigLog(MODNAME,MLog::logAlert,QString("error ")+ERR_BALANCEFAIL);
                                            this->server->sendFault(id,ERR_BALANCEFAIL_ID,ERR_BALANCEFAIL);
                                        }
                                    }else{
                                        // фиксируем изменения в базу
                    if(!this->db.commit()){
                        // тут ваще все плохо, изменения не прокатали
                        // вот же блять, и ролбек не сработал, ругаемся в темную голову.
                        emit this->sigLog(MODNAME,MLog::logAlert,QString("error ")+ERR_SQLERR);
                        this->server->sendFault(id,ERR_SQLERR_ID,ERR_SQLERR);

                                    }else{
                    // формируем ответ
                    QList<xmlrpc::Variant> ret;
                    ret.append(qq3.value(1).toString());
                    ret.append(tuid);
                    // отправляем ответ
                    this->server->sendReturnValue(id,ret);
                emit this->sigLog(MODNAME,MLog::logInfo,QString("RPC stop user.ticket.sale USER=%2 SID=%3 HOST=%1").arg(host)
                                  .arg(parameters.at(0).toList().at(0).toString())
                                  .arg(parameters.at(0).toList().at(1).toString()));
                    }}}}}}
            }
        }}
    }
    }

    // rept_event.geteventslist
    if(methodName == "rept_event.geteventslist"){
        emit this->sigLog(MODNAME,MLog::logInfo,QString("RPC start  rept_event.geteventslist USER=%2 SID=%3 HOST=%1").arg(host)
                          .arg(parameters.at(0).toList().at(0).toString())
                          .arg(parameters.at(0).toList().at(1).toString()));
        // опапа прилетел запрос
        // сначала зачищаем сессии
        if(!this->clearOldSessions()){
                emit this->sigLog(MODNAME,MLog::logAlert,QString("error ")+ERR_SESSCLRERR);
                this->server->sendFault(id,ERR_SESSCLRERR_ID,ERR_SESSCLRERR);
        }else{

        // проверяем количество параметров - должно быть 4 имя пользователя и его хэш
        // дата начала и дата конца
        if(parameters.at(0).toList().size()!=4){
            // неверное количество параметров
            emit this->sigLog(MODNAME,MLog::logAlert,QString("error ")+ERR_PARAMSCOUNT);
            this->server->sendFault(id,ERR_PARAMSCOUNT_ID,ERR_PARAMSCOUNT);
        }else{
            // теперь проверяем наличие сессии данного пользователя в списке активных,
            // ежели нема ее там то кишь его кишь из работы, пущай перелогиниться.

            // вынимаем пользователя и хэш
            if(!this->testSesstion(parameters.at(0).toList().at(0).toString(),
                               parameters.at(0).toList().at(1).toString())){
                emit this->sigLog(MODNAME,MLog::logAlert,QString("error ")+ERR_SESSTESTERR);
                this->server->sendFault(id,ERR_SESSTESTERR_ID,ERR_SESSTESTERR);
            }else{
                // собственно делаем что надо
                // вынимаем дату начала и конца
                QString d_de=parameters.at(0).toList().at(2).toString();
                QString d_gxis=parameters.at(0).toList().at(3).toString();
                // наша задача получить список и отправить его клиенту
                QString qs1=QString("select `event_dt`,`name` from `events` ")+
                        QString("where `event_dt` > '%1' and `event_dt` < '%2' order by `event_dt`")
                        .arg(this->sqlsafe(d_de))
                        .arg(this->sqlsafe(d_gxis));

                QSqlQuery qq1;
                emit this->sigLog(MODNAME,MLog::logDebug,QString("SQL [%1]").arg(qs1));
                if(!qq1.exec(qs1)){
                    emit this->sigLog(MODNAME,MLog::logAlert,QString("error ")+ERR_SQLERR);
                    this->server->sendFault(id,ERR_SQLERR_ID,ERR_SQLERR);
                }else{
                    // формируем ответ
                    QList<xmlrpc::Variant> ret;
                    while(qq1.next()){
                        ret.append(qq1.value(0).toDateTime().toString("yyyy-MM-dd hh:mm:ss"));
                        ret.append(qq1.value(1).toString());
                    }
                    // отправляем ответ
                    this->server->sendReturnValue(id,ret);
                emit this->sigLog(MODNAME,MLog::logInfo,QString("RPC stop rept_event.geteventslist USER=%2 SID=%3 HOST=%1").arg(host)
                                  .arg(parameters.at(0).toList().at(0).toString())
                                  .arg(parameters.at(0).toList().at(1).toString()));
                }
            }
        }}
    }

    // rept_event.getevtick
    if(methodName == "rept_event.getevtick"){
        emit this->sigLog(MODNAME,MLog::logInfo,QString("RPC start rept_event.getevtick USER=%2 SID=%3 HOST=%1").arg(host)
                          .arg(parameters.at(0).toList().at(0).toString())
                          .arg(parameters.at(0).toList().at(1).toString()));
        // опапа прилетел запрос
        // сначала зачищаем сессии
        if(!this->clearOldSessions()){
                emit this->sigLog(MODNAME,MLog::logAlert,QString("error ")+ERR_SESSCLRERR);
                this->server->sendFault(id,ERR_SESSCLRERR_ID,ERR_SESSCLRERR);
        }else{

        // проверяем количество параметров - должно быть 4 имя пользователя и его хэш
        // наименование события и его дата
        if(parameters.at(0).toList().size()!=4){
            // неверное количество параметров
            emit this->sigLog(MODNAME,MLog::logAlert,QString("error ")+ERR_PARAMSCOUNT);
            this->server->sendFault(id,ERR_PARAMSCOUNT_ID,ERR_PARAMSCOUNT);
        }else{
            // теперь проверяем наличие сессии данного пользователя в списке активных,
            // ежели нема ее там то кишь его кишь из работы, пущай перелогиниться.

            // вынимаем пользователя и хэш
            if(!this->testSesstion(parameters.at(0).toList().at(0).toString(),
                               parameters.at(0).toList().at(1).toString())){
                emit this->sigLog(MODNAME,MLog::logAlert,QString("error ")+ERR_SESSTESTERR);
                this->server->sendFault(id,ERR_SESSTESTERR_ID,ERR_SESSTESTERR);
            }else{
                // собственно делаем что надо
                // вынимаем дату начала и конца
                QString evname=parameters.at(0).toList().at(2).toString();
                QString evdate=parameters.at(0).toList().at(3).toString();
                // наша задача получить список и отправить его клиенту
                QString qs1=QString("select `tickets`.`tuid`, `tickets`.`sale_date`, `tickets`.`cost`, `tickets`.`tariff_name` ,`users`.`username`  , `tickets`.`delete_date`, `tickets`.`delete_user` ,`tickets`.`status`");
                    qs1+=QString("from `tickets`,`users`,`events` ");
                    qs1+=QString("where `tickets`.`event_id` = `events`.`id` ");
                    qs1+=QString("and `tickets`.`user_id` = `users`.`id`");
                    qs1+=QString("and `events`.`name` = '%1' and `events`.`event_dt` = '%2' order by `users`.`username`")
                        .arg(this->sqlsafe(evname))
                        .arg(this->sqlsafe(evdate));

                QSqlQuery qq1;
                emit this->sigLog(MODNAME,MLog::logDebug,QString("SQL [%1]").arg(qs1));
                if(!qq1.exec(qs1)){
                    emit this->sigLog(MODNAME,MLog::logAlert,QString("error ")+ERR_SQLERR);
                    this->server->sendFault(id,ERR_SQLERR_ID,ERR_SQLERR);
                }else{
                    // формируем ответ
                    QList<xmlrpc::Variant> ret;
                    while(qq1.next()){
                        ret.append(qq1.value(0).toString());
                        ret.append(qq1.value(1).toDateTime().toString("yyyy-MM-dd hh:mm:ss"));
                        ret.append(qq1.value(2).toString());
                        ret.append(qq1.value(3).toString());
                        ret.append(qq1.value(4).toString());
                        ret.append(qq1.value(5).toDateTime().toString("yyyy-MM-dd hh:mm:ss"));
                        ret.append(qq1.value(6).toString());
                        ret.append(qq1.value(7).toInt());

                    }
                    // отправляем ответ
                    this->server->sendReturnValue(id,ret);
                emit this->sigLog(MODNAME,MLog::logInfo,QString("RPC stop  rept_event.getevtick USER=%2 SID=%3 HOST=%1").arg(host)
                                  .arg(parameters.at(0).toList().at(0).toString())
                                  .arg(parameters.at(0).toList().at(1).toString()));
                }
            }
        }}
    }

    // user.reticket.info
    if(methodName == "user.reticket.info"){
        emit this->sigLog(MODNAME,MLog::logInfo,QString("RPC start  user.reticket.info USER=%2 SID=%3 HOST=%1").arg(host)
                          .arg(parameters.at(0).toList().at(0).toString())
                          .arg(parameters.at(0).toList().at(1).toString()));
        // опапа прилетел запрос
        // сначала зачищаем сессии
        if(!this->clearOldSessions()){
                emit this->sigLog(MODNAME,MLog::logAlert,QString("error ")+ERR_SESSCLRERR);
                this->server->sendFault(id,ERR_SESSCLRERR_ID,ERR_SESSCLRERR);
        }else{

        // проверяем количество параметров - должно быть 3 имя пользователя и его хэш
        // TUID идентификатор билета
        if(parameters.at(0).toList().size()!=3){
            // неверное количество параметров
            emit this->sigLog(MODNAME,MLog::logAlert,QString("error ")+ERR_PARAMSCOUNT);
            this->server->sendFault(id,ERR_PARAMSCOUNT_ID,ERR_PARAMSCOUNT);
        }else{
            // теперь проверяем наличие сессии данного пользователя в списке активных,
            // ежели нема ее там то кишь его кишь из работы, пущай перелогиниться.

            // вынимаем пользователя и хэш
            if(!this->testSesstion(parameters.at(0).toList().at(0).toString(),
                               parameters.at(0).toList().at(1).toString())){
                emit this->sigLog(MODNAME,MLog::logAlert,QString("error ")+ERR_SESSTESTERR);
                this->server->sendFault(id,ERR_SESSTESTERR_ID,ERR_SESSTESTERR);
            }else{
                // собственно делаем что надо
                // вынимаем tuid
                QString tuid=parameters.at(0).toList().at(2).toString();
                // наша задача получить данные о билете
                QString qs1=QString("select `tickets`.`tuid` as `tuid`, `users`.`username` as `user`, `events`.`name` as `event`, `tickets`.`tariff_name` as `tariff`,`tickets`.`cost`,`tickets`.`sale_date` from `tickets`,`users`,`events` where `tickets`.`tuid` = '%1' and `tickets`.`user_id` = `users`.`id` and `tickets`.`event_id` = `events`.`id` and `tickets`.`status` = 0")
                        .arg(tuid);

                QSqlQuery qq1;
                emit this->sigLog(MODNAME,MLog::logDebug,QString("SQL [%1]").arg(qs1));
                if(!qq1.exec(qs1)){
                    emit this->sigLog(MODNAME,MLog::logAlert,QString("error ")+ERR_SQLERR);
                    this->server->sendFault(id,ERR_SQLERR_ID,ERR_SQLERR);
                }else{
                    // проверяем наличие ответа.
                    if(!qq1.next()){
                        // беда, нету такого tuid шлем эрор
                        emit this->sigLog(MODNAME,MLog::logAlert,QString("error ")+ERR_TUIDFAIL);
                        this->server->sendFault(id,ERR_TUIDFAIL_ID,ERR_TUIDFAIL);
                    }else{
                        // что то прилетело =) вынимаем данные
                        QList<xmlrpc::Variant> ret;
                        ret.append(qq1.value(0).toString());
                        ret.append(qq1.value(1).toString());
                        ret.append(qq1.value(2).toString());
                        ret.append(qq1.value(3).toString());
                        ret.append(qq1.value(4).toString());
                        ret.append(qq1.value(5).toDateTime().toString("yyyy-MM-dd hh:mm:ss"));
                        this->server->sendReturnValue(id,ret);
                emit this->sigLog(MODNAME,MLog::logInfo,QString("RPC stop user.reticket.info USER=%2 SID=%3 HOST=%1").arg(host)
                                  .arg(parameters.at(0).toList().at(0).toString())
                                  .arg(parameters.at(0).toList().at(1).toString()));
                    }}
            }
        }
        }
    }

    // user.reticket.back
    if(methodName == "user.reticket.back"){
        emit this->sigLog(MODNAME,MLog::logInfo,QString("RPC start  user.reticket.back USER=%2 SID=%3 HOST=%1").arg(host)
                          .arg(parameters.at(0).toList().at(0).toString())
                          .arg(parameters.at(0).toList().at(1).toString()));
        // опапа прилетел запрос
        // сначала зачищаем сессии
        if(!this->clearOldSessions()){
                emit this->sigLog(MODNAME,MLog::logAlert,QString("error ")+ERR_SESSCLRERR);
                this->server->sendFault(id,ERR_SESSCLRERR_ID,ERR_SESSCLRERR);
        }else{

        // проверяем количество параметров - должно быть 3 имя пользователя и его хэш
        // TUID идентификатор билета
        if(parameters.at(0).toList().size()!=3){
            // неверное количество параметров
            emit this->sigLog(MODNAME,MLog::logAlert,QString("error ")+ERR_PARAMSCOUNT);
            this->server->sendFault(id,ERR_PARAMSCOUNT_ID,ERR_PARAMSCOUNT);
        }else{
            // теперь проверяем наличие сессии данного пользователя в списке активных,
            // ежели нема ее там то кишь его кишь из работы, пущай перелогиниться.

            // вынимаем пользователя и хэш
            if(!this->testSesstion(parameters.at(0).toList().at(0).toString(),
                               parameters.at(0).toList().at(1).toString())){
                emit this->sigLog(MODNAME,MLog::logAlert,QString("error ")+ERR_SESSTESTERR);
                this->server->sendFault(id,ERR_SESSTESTERR_ID,ERR_SESSTESTERR);
            }else{
                // собственно делаем что надо
                // вынимаем tuid
                QString tuid=parameters.at(0).toList().at(2).toString();
                bool statusEvent = false;
                // проверяем закрыто ли событие если есть reticket_if_oldevent
                if(this->isReticketEvent){
                    // проверяем, закрыто ли событие которому принадлежит возвращяемый билет
                    QString qs2 = QString("select `events`.`event_dt` < NOW() from `tickets`,`events` where `tickets`.`event_id` = `events`.`id` and `tickets`.`tuid` = '%1'")
                            .arg(this->sqlsafe(tuid));
                    QSqlQuery qq2;
                    emit this->sigLog(MODNAME,MLog::logDebug,QString("SQL [%1]").arg(qs2));
                    if(!qq2.exec(qs2)){
                        emit this->sigLog(MODNAME,MLog::logAlert,QString("error ")+ERR_SQLERR);
                        this->server->sendFault(id,ERR_SQLERR_ID,ERR_SQLERR);
                    }else{
                        // проверяем что вернулось, если 1 значит событие уже произошло
                        // и надо ругаться но при условии что в конфиге есть параметр reticket_if_oldevent=true;
                        qq2.next();
                        statusEvent = qq2.value(0).toBool();
                        if(statusEvent){
                            // надо поругаться
                            emit this->sigLog(MODNAME,MLog::logAlert,QString("error ")+ERR_EVENTOLDFAIL);
                            this->server->sendFault(id,ERR_EVENTOLDFAIL_ID,ERR_EVENTOLDFAIL);
                        }
                    }
                }



                if(!statusEvent){
                    // наша задача обновить билет
                    QString qs1=QString("update `tickets` set `status` = 1 , `delete_user` = '%1' , delete_date = NOW() where tuid = '%2'")
                            .arg(parameters.at(0).toList().at(0).toString())
                            .arg(tuid);

                    QSqlQuery qq1;
                    emit this->sigLog(MODNAME,MLog::logDebug,QString("SQL [%1]").arg(qs1));
                    if(!qq1.exec(qs1)){
                        emit this->sigLog(MODNAME,MLog::logAlert,QString("error ")+ERR_SQLERR);
                        this->server->sendFault(id,ERR_SQLERR_ID,ERR_SQLERR);
                    }else{
                            QList<xmlrpc::Variant> ret;
                            ret.append(QString("OK"));
                            this->server->sendReturnValue(id,ret);
                    emit this->sigLog(MODNAME,MLog::logInfo,QString("RPC stop user.reticket.back USER=%2 SID=%3 HOST=%1").arg(host)
                                      .arg(parameters.at(0).toList().at(0).toString())
                                      .arg(parameters.at(0).toList().at(1).toString()));
                    }
                }
            }
        }
        }
    }

    // rept_user.getusers
    if(methodName == "rept_user.getusers"){
        emit this->sigLog(MODNAME,MLog::logInfo,QString("RPC start  rept_user.getusers USER=%2 SID=%3 HOST=%1").arg(host)
                          .arg(parameters.at(0).toList().at(0).toString())
                          .arg(parameters.at(0).toList().at(1).toString()));
        // опапа прилетел запрос
        // сначала зачищаем сессии
        if(!this->clearOldSessions()){
                emit this->sigLog(MODNAME,MLog::logAlert,QString("error ")+ERR_SESSCLRERR);
                this->server->sendFault(id,ERR_SESSCLRERR_ID,ERR_SESSCLRERR);
        }else{

        // проверяем количество параметров - должно быть 2 имя пользователя и его хэш
        //
        if(parameters.at(0).toList().size()!=2){
            // неверное количество параметров
            emit this->sigLog(MODNAME,MLog::logAlert,QString("error ")+ERR_PARAMSCOUNT);
            this->server->sendFault(id,ERR_PARAMSCOUNT_ID,ERR_PARAMSCOUNT);
        }else{
            // теперь проверяем наличие сессии данного пользователя в списке активных,
            // ежели нема ее там то кишь его кишь из работы, пущай перелогиниться.

            // вынимаем пользователя и хэш
            if(!this->testSesstion(parameters.at(0).toList().at(0).toString(),
                               parameters.at(0).toList().at(1).toString())){
                emit this->sigLog(MODNAME,MLog::logAlert,QString("error ")+ERR_SESSTESTERR);
                this->server->sendFault(id,ERR_SESSTESTERR_ID,ERR_SESSTESTERR);
            }else{
                // собственно делаем что надо
                // запрашиваем список пользователей
                QString qs1=QString("select `users`.`username` from `users` where `users`.`usertype` = 0 and `users`.`state` = 1");


                QSqlQuery qq1;
                emit this->sigLog(MODNAME,MLog::logDebug,QString("SQL [%1]").arg(qs1));
                if(!qq1.exec(qs1)){
                    emit this->sigLog(MODNAME,MLog::logAlert,QString("error ")+ERR_SQLERR);
                    this->server->sendFault(id,ERR_SQLERR_ID,ERR_SQLERR);
                }else{
                        QList<xmlrpc::Variant> ret;
                        while(qq1.next()){
                            ret.append(qq1.value(0).toString());
                        }
                        this->server->sendReturnValue(id,ret);
                emit this->sigLog(MODNAME,MLog::logInfo,QString("RPC stop rept_user.getusers USER=%2 SID=%3 HOST=%1").arg(host)
                                  .arg(parameters.at(0).toList().at(0).toString())
                                  .arg(parameters.at(0).toList().at(1).toString()));
                    }
            }
        }
        }
    }

    //rept_user.gettickets
    if(methodName == "rept_user.gettickets"){
        emit this->sigLog(MODNAME,MLog::logInfo,QString("RPC start  rept_user.gettickets USER=%2 SID=%3 HOST=%1").arg(host)
                          .arg(parameters.at(0).toList().at(0).toString())
                          .arg(parameters.at(0).toList().at(1).toString()));
        // опапа прилетел запрос
        // сначала зачищаем сессии
        if(!this->clearOldSessions()){
                emit this->sigLog(MODNAME,MLog::logAlert,QString("error ")+ERR_SESSCLRERR);
                this->server->sendFault(id,ERR_SESSCLRERR_ID,ERR_SESSCLRERR);
        }else{

        // проверяем количество параметров - должно быть 5 имя пользователя и его хэш
        // имя продавца и две даты от и до
        if(parameters.at(0).toList().size()!=5){
            // неверное количество параметров
            emit this->sigLog(MODNAME,MLog::logAlert,QString("error ")+ERR_PARAMSCOUNT);
            this->server->sendFault(id,ERR_PARAMSCOUNT_ID,ERR_PARAMSCOUNT);
        }else{
            // теперь проверяем наличие сессии данного пользователя в списке активных,
            // ежели нема ее там то кишь его кишь из работы, пущай перелогиниться.

            // вынимаем пользователя и хэш
            if(!this->testSesstion(parameters.at(0).toList().at(0).toString(),
                               parameters.at(0).toList().at(1).toString())){
                emit this->sigLog(MODNAME,MLog::logAlert,QString("error ")+ERR_SESSTESTERR);
                this->server->sendFault(id,ERR_SESSTESTERR_ID,ERR_SESSTESTERR);
            }else{
                // собственно делаем что надо
                // вынимаем данные
                QString user = parameters.at(0).toList().at(2).toString();
                QString dfrom = parameters.at(0).toList().at(3).toString();
                QString dto=parameters.at(0).toList().at(4).toString();


                // заправшиваем билеты для пользователя
                QString qs1(QString("select `tickets`.`tuid` as `tuid`, `tickets`.`sale_date` as `sale date`, \
                            `tickets`.`cost` as `cost`, `tickets`.`tariff_name` as `tariff`, \
                            `tickets`.`status` as `status`, `tickets`.`delete_user` , \
                            `tickets`.`delete_date`, `events`.`name` \
                             , `events`.`event_dt` \
                            from `tickets`, `users`, `events` \
                             where `tickets`.`user_id` = `users`.`id` \
                        and `tickets`.`event_id` = `events`.`id` \
                         and `users`.`username` = '%1' and `tickets`.`sale_date` > '%2' and `tickets`.`sale_date` < '%3'\
                        order by `tickets`.`sale_date`")
                        .arg(this->sqlsafe(user))
                        .arg(this->sqlsafe(dfrom))
                        .arg(this->sqlsafe(dto)));

                QSqlQuery qq1;
                emit this->sigLog(MODNAME,MLog::logDebug,QString("SQL [%1]").arg(qs1));
                if(!qq1.exec(qs1)){
                    emit this->sigLog(MODNAME,MLog::logAlert,QString("error ")+ERR_SQLERR);
                    this->server->sendFault(id,ERR_SQLERR_ID,ERR_SQLERR);
                }else{
                        QList<xmlrpc::Variant> ret;
                        while(qq1.next()){
                            ret.append(qq1.value(0).toString());
                            ret.append(qq1.value(1).toDateTime().toString("yyyy-MM-dd hh:mm"));
                            ret.append(qq1.value(2).toString());
                            ret.append(qq1.value(3).toString());
                            ret.append(qq1.value(4).toString());
                            ret.append(qq1.value(5).toString());
                            ret.append(qq1.value(6).toDateTime().toString("yyyy-MM-dd hh:mm"));
                            ret.append(qq1.value(7).toString());
                            ret.append(qq1.value(8).toDateTime().toString("yyyy-MM-dd hh:mm"));
                        }
                        this->server->sendReturnValue(id,ret);
                emit this->sigLog(MODNAME,MLog::logInfo,QString("RPC stop rept_user.gettickets USER=%2 SID=%3 HOST=%1").arg(host)
                                  .arg(parameters.at(0).toList().at(0).toString())
                                  .arg(parameters.at(0).toList().at(1).toString()));
                    }
            }
        }
        }
    }


    //user.rpt.ticketslist
    if(methodName == "user.rpt.ticketslist"){
        emit this->sigLog(MODNAME,MLog::logInfo,QString("RPC start  user.rpt.ticketslist USER=%2 SID=%3 HOST=%1").arg(host)
                          .arg(parameters.at(0).toList().at(0).toString())
                          .arg(parameters.at(0).toList().at(1).toString()));
        // опапа прилетел запрос
        // сначала зачищаем сессии
        if(!this->clearOldSessions()){
                emit this->sigLog(MODNAME,MLog::logAlert,QString("error ")+ERR_SESSCLRERR);
                this->server->sendFault(id,ERR_SESSCLRERR_ID,ERR_SESSCLRERR);
        }else{

        // проверяем количество параметров - должно быть 4 имя пользователя и его хэш
        // две даты от и до
        if(parameters.at(0).toList().size()!=4){
            // неверное количество параметров
            emit this->sigLog(MODNAME,MLog::logAlert,QString("error ")+ERR_PARAMSCOUNT);
            this->server->sendFault(id,ERR_PARAMSCOUNT_ID,ERR_PARAMSCOUNT);
        }else{
            // теперь проверяем наличие сессии данного пользователя в списке активных,
            // ежели нема ее там то кишь его кишь из работы, пущай перелогиниться.

            // вынимаем пользователя и хэш
            if(!this->testSesstion(parameters.at(0).toList().at(0).toString(),
                               parameters.at(0).toList().at(1).toString())){
                emit this->sigLog(MODNAME,MLog::logAlert,QString("error ")+ERR_SESSTESTERR);
                this->server->sendFault(id,ERR_SESSTESTERR_ID,ERR_SESSTESTERR);
            }else{
                // собственно делаем что надо
                // вынимаем данные
                QString user = parameters.at(0).toList().at(0).toString();
                QString dfrom = parameters.at(0).toList().at(2).toString();
                QString dto=parameters.at(0).toList().at(3).toString();


                // заправшиваем билеты для пользователя
                QString qs1(QString("select `tickets`.`tuid` as `tuid`, `tickets`.`sale_date` as `sale date`, \
                            `tickets`.`cost` as `cost`, `tickets`.`tariff_name` as `tariff`, \
                            `tickets`.`status` as `status`, `tickets`.`delete_user` , \
                            `tickets`.`delete_date`, `events`.`name` \
                             , `events`.`event_dt` \
                            from `tickets`, `users`, `events` \
                             where `tickets`.`user_id` = `users`.`id` \
                        and `tickets`.`event_id` = `events`.`id` \
                         and `users`.`username` = '%1' and `tickets`.`sale_date` > '%2' and `tickets`.`sale_date` < '%3'\
                        order by `tickets`.`sale_date`")
                        .arg(this->sqlsafe(user))
                        .arg(this->sqlsafe(dfrom))
                        .arg(this->sqlsafe(dto)));

                QSqlQuery qq1;
                emit this->sigLog(MODNAME,MLog::logDebug,QString("SQL [%1]").arg(qs1));
                if(!qq1.exec(qs1)){
                    emit this->sigLog(MODNAME,MLog::logAlert,QString("error ")+ERR_SQLERR);
                    this->server->sendFault(id,ERR_SQLERR_ID,ERR_SQLERR);
                }else{
                        QList<xmlrpc::Variant> ret;
                        while(qq1.next()){
                            ret.append(qq1.value(0).toString());
                            ret.append(qq1.value(1).toDateTime().toString("yyyy-MM-dd hh:mm"));
                            ret.append(qq1.value(2).toString());
                            ret.append(qq1.value(3).toString());
                            ret.append(qq1.value(4).toString());
                            ret.append(qq1.value(5).toString());
                            ret.append(qq1.value(6).toDateTime().toString("yyyy-MM-dd hh:mm"));
                            ret.append(qq1.value(7).toString());
                            ret.append(qq1.value(8).toDateTime().toString("yyyy-MM-dd hh:mm"));
                        }
                        this->server->sendReturnValue(id,ret);
                emit this->sigLog(MODNAME,MLog::logInfo,QString("RPC stop user.rpt.ticketslist USER=%2 SID=%3 HOST=%1").arg(host)
                                  .arg(parameters.at(0).toList().at(0).toString())
                                  .arg(parameters.at(0).toList().at(1).toString()));
                    }
            }
        }
        }
    }


}}}


void MDxserver::setSessionTtl(int sec){
    this->session_ttl=sec;
}

bool MDxserver::clearOldSessions(){
    // основная задача удалить старые сессии
    // вторая задача - у прошедших событий установить флаг закрытия
    QSqlQuery qq;
    QString qline=QString("delete from `sessions` where `lastsync`<now() - INTERVAL %1 SECOND ").arg(
                this->sqlsafe(QString::number(this->session_ttl)));
    emit this->sigLog(MODNAME,MLog::logDebug,QString("SQL [%1]").arg(qline));
    if(!qq.exec(qline)){
        return false;
    }

    QString qs1=QString("update `events` set `state` = 1 where `state` = 0 and `event_dt` < NOW()");
    QSqlQuery qq1;
    emit this->sigLog(MODNAME,MLog::logDebug,QString("SQL [%1]").arg(qs1));
    if(!qq1.exec(qs1)){
        return false;
    }
        return true;
}

bool MDxserver::testSesstion(const QString &uname, const QString &uhash){
    // основная задача проверить наличие сессии и обновить ее при наличии, иначе ругаться.
        QSqlQuery qq;
        QString qline=QString("select count(*) from sessions where `id_users`=(select `id` from `users` where `username`='%1') and `userhash`='%2'").arg(this->sqlsafe(uname)).arg(this->sqlsafe(uhash));
        emit this->sigLog(MODNAME,MLog::logDebug,QString("SQL [%1]").arg(qline));
        if(!qq.exec(qline)){
            return false;
        }
        qq.next();
        int isok = qq.value(0).toInt();
        // запрос выполнился, смотрим количество. ежели оно не равно 1 значит бида печаль и все идет прахом.
        if(isok!=1){
            return false;
        }else{
            // все гуд, обновляем сессию
            QSqlQuery qm;
            QString ql=QString("update `sessions` set `lastsync`=NOW() where `id_users`=(select `id` from `users` where `username`='%1') and `userhash`='%2'").arg(
                        this->sqlsafe(uname)).arg(this->sqlsafe(uhash));
            emit this->sigLog(MODNAME,MLog::logDebug,QString("SQL [%1]").arg(ql));
            if(!qm.exec(ql)){
                // с базой что то не так
                return false;
            }else{
                // все отлично
                return true;
            }
        }
}


void MDxserver::setReticketEvent(bool value){
    this->isReticketEvent = value;
}
